// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by google-apis-code-generator 1.5.1
//     C# generator version: 1.22.0
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

/**
 * \brief
 *   Cloud Spanner API Version v1
 *
 * \section ApiInfo API Version Information
 *    <table>
 *      <tr><th>API
 *          <td><a href='https://cloud.google.com/spanner/'>Cloud Spanner API</a>
 *      <tr><th>API Version<td>v1
 *      <tr><th>API Rev<td>20170317 (806)
 *      <tr><th>API Docs
 *          <td><a href='https://cloud.google.com/spanner/'>
 *              https://cloud.google.com/spanner/</a>
 *      <tr><th>Discovery Name<td>spanner
 *    </table>
 *
 * \section ForMoreInfo For More Information
 *
 * The complete API documentation for using Cloud Spanner API can be found at
 * <a href='https://cloud.google.com/spanner/'>https://cloud.google.com/spanner/</a>.
 *
 * For more information about the Google APIs Client Library for .NET, see
 * <a href='https://developers.google.com/api-client-library/dotnet/get_started'>
 * https://developers.google.com/api-client-library/dotnet/get_started</a>
 */

namespace Google.Apis.Spanner.v1
{
    /// <summary>The Spanner Service.</summary>
    public class SpannerService : Google.Apis.Services.BaseClientService
    {
        /// <summary>The API version.</summary>
        public const string Version = "v1";

        /// <summary>The discovery version used to generate this service.</summary>
        public static Google.Apis.Discovery.DiscoveryVersion DiscoveryVersionUsed =
            Google.Apis.Discovery.DiscoveryVersion.Version_1_0;

        /// <summary>Constructs a new service.</summary>
        public SpannerService() :
            this(new Google.Apis.Services.BaseClientService.Initializer()) {}

        /// <summary>Constructs a new service.</summary>
        /// <param name="initializer">The service initializer.</param>
        public SpannerService(Google.Apis.Services.BaseClientService.Initializer initializer)
            : base(initializer)
        {
            projects = new ProjectsResource(this);
        }

        /// <summary>Gets the service supported features.</summary>
        public override System.Collections.Generic.IList<string> Features
        {
            get { return new string[0]; }
        }

        /// <summary>Gets the service name.</summary>
        public override string Name
        {
            get { return "spanner"; }
        }

        /// <summary>Gets the service base URI.</summary>
        public override string BaseUri
        {
            get { return "https://spanner.googleapis.com/"; }
        }

        /// <summary>Gets the service base path.</summary>
        public override string BasePath
        {
            get { return ""; }
        }

        /// <summary>Available OAuth 2.0 scopes for use with the Cloud Spanner API.</summary>
        public class Scope
        {
            /// <summary>View and manage your data across Google Cloud Platform services</summary>
            public static string CloudPlatform = "https://www.googleapis.com/auth/cloud-platform";

        }



        private readonly ProjectsResource projects;

        /// <summary>Gets the Projects resource.</summary>
        public virtual ProjectsResource Projects
        {
            get { return projects; }
        }
    }

    ///<summary>A base abstract class for Spanner requests.</summary>
    public abstract class SpannerBaseServiceRequest<TResponse> : Google.Apis.Requests.ClientServiceRequest<TResponse>
    {
        ///<summary>Constructs a new SpannerBaseServiceRequest instance.</summary>
        protected SpannerBaseServiceRequest(Google.Apis.Services.IClientService service)
            : base(service)
        {
        }

        /// <summary>V1 error format.</summary>
        [Google.Apis.Util.RequestParameterAttribute("$.xgafv", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<XgafvEnum> Xgafv { get; set; }

        /// <summary>V1 error format.</summary>
        public enum XgafvEnum
        {
            /// <summary>v1 error format</summary>
            [Google.Apis.Util.StringValueAttribute("1")]
            Value1,
            /// <summary>v2 error format</summary>
            [Google.Apis.Util.StringValueAttribute("2")]
            Value2,
        }

        /// <summary>OAuth access token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("access_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string AccessToken { get; set; }

        /// <summary>Data format for response.</summary>
        /// [default: json]
        [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<AltEnum> Alt { get; set; }

        /// <summary>Data format for response.</summary>
        public enum AltEnum
        {
            /// <summary>Responses with Content-Type of application/json</summary>
            [Google.Apis.Util.StringValueAttribute("json")]
            Json,
            /// <summary>Media download with context-dependent Content-Type</summary>
            [Google.Apis.Util.StringValueAttribute("media")]
            Media,
            /// <summary>Responses with Content-Type of application/x-protobuf</summary>
            [Google.Apis.Util.StringValueAttribute("proto")]
            Proto,
        }

        /// <summary>OAuth bearer token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("bearer_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string BearerToken { get; set; }

        /// <summary>JSONP</summary>
        [Google.Apis.Util.RequestParameterAttribute("callback", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Callback { get; set; }

        /// <summary>Selector specifying which fields to include in a partial response.</summary>
        [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Fields { get; set; }

        /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and reports.
        /// Required unless you provide an OAuth 2.0 token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Key { get; set; }

        /// <summary>OAuth 2.0 token for the current user.</summary>
        [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string OauthToken { get; set; }

        /// <summary>Pretty-print response.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("pp", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> Pp { get; set; }

        /// <summary>Returns response with indentations and line breaks.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> PrettyPrint { get; set; }

        /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
        /// assigned to a user, but should not exceed 40 characters.</summary>
        [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string QuotaUser { get; set; }

        /// <summary>Legacy upload protocol for media (e.g. "media", "multipart").</summary>
        [Google.Apis.Util.RequestParameterAttribute("uploadType", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UploadType { get; set; }

        /// <summary>Upload protocol for media (e.g. "raw", "multipart").</summary>
        [Google.Apis.Util.RequestParameterAttribute("upload_protocol", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UploadProtocol { get; set; }

        /// <summary>Initializes Spanner parameter list.</summary>
        protected override void InitParameters()
        {
            base.InitParameters();

            RequestParameters.Add(
                "$.xgafv", new Google.Apis.Discovery.Parameter
                {
                    Name = "$.xgafv",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "access_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "access_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "alt", new Google.Apis.Discovery.Parameter
                {
                    Name = "alt",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "json",
                    Pattern = null,
                });
            RequestParameters.Add(
                "bearer_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "bearer_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "callback", new Google.Apis.Discovery.Parameter
                {
                    Name = "callback",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "fields", new Google.Apis.Discovery.Parameter
                {
                    Name = "fields",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "key", new Google.Apis.Discovery.Parameter
                {
                    Name = "key",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "oauth_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "oauth_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "pp", new Google.Apis.Discovery.Parameter
                {
                    Name = "pp",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "prettyPrint", new Google.Apis.Discovery.Parameter
                {
                    Name = "prettyPrint",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "quotaUser", new Google.Apis.Discovery.Parameter
                {
                    Name = "quotaUser",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "uploadType", new Google.Apis.Discovery.Parameter
                {
                    Name = "uploadType",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "upload_protocol", new Google.Apis.Discovery.Parameter
                {
                    Name = "upload_protocol",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
        }
    }

    /// <summary>The "projects" collection of methods.</summary>
    public class ProjectsResource
    {
        private const string Resource = "projects";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ProjectsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;
            instanceConfigs = new InstanceConfigsResource(service);
            instances = new InstancesResource(service);

        }

        private readonly InstanceConfigsResource instanceConfigs;

        /// <summary>Gets the InstanceConfigs resource.</summary>
        public virtual InstanceConfigsResource InstanceConfigs
        {
            get { return instanceConfigs; }
        }

        /// <summary>The "instanceConfigs" collection of methods.</summary>
        public class InstanceConfigsResource
        {
            private const string Resource = "instanceConfigs";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public InstanceConfigsResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;

            }


            /// <summary>Gets information about a particular instance configuration.</summary>
            /// <param name="name">Required. The name of the requested instance configuration. Values are of the form
            /// `projects//instanceConfigs/`.</param>
            public virtual GetRequest Get(string name)
            {
                return new GetRequest(service, name);
            }

            /// <summary>Gets information about a particular instance configuration.</summary>
            public class GetRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.InstanceConfig>
            {
                /// <summary>Constructs a new Get request.</summary>
                public GetRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>Required. The name of the requested instance configuration. Values are of the form
                /// `projects//instanceConfigs/`.</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "get"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+name}"; }
                }

                /// <summary>Initializes Get parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instanceConfigs/[^/]+$",
                        });
                }

            }

            /// <summary>Lists the supported instance configurations for a given project.</summary>
            /// <param name="parent">Required. The name of the project for which a list of supported instance configurations is
            /// requested. Values are of the form `projects/`.</param>
            public virtual ListRequest List(string parent)
            {
                return new ListRequest(service, parent);
            }

            /// <summary>Lists the supported instance configurations for a given project.</summary>
            public class ListRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ListInstanceConfigsResponse>
            {
                /// <summary>Constructs a new List request.</summary>
                public ListRequest(Google.Apis.Services.IClientService service, string parent)
                    : base(service)
                {
                    Parent = parent;
                    InitParameters();
                }


                /// <summary>Required. The name of the project for which a list of supported instance configurations is
                /// requested. Values are of the form `projects/`.</summary>
                [Google.Apis.Util.RequestParameterAttribute("parent", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Parent { get; private set; }

                /// <summary>If non-empty, `page_token` should contain a next_page_token from a previous
                /// ListInstanceConfigsResponse.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string PageToken { get; set; }

                /// <summary>Number of instance configurations to be returned in the response. If 0 or less, defaults to
                /// the server's maximum allowed page size.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<int> PageSize { get; set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "list"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+parent}/instanceConfigs"; }
                }

                /// <summary>Initializes List parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "parent", new Google.Apis.Discovery.Parameter
                        {
                            Name = "parent",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "pageToken", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageToken",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageSize", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageSize",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }
        }
        private readonly InstancesResource instances;

        /// <summary>Gets the Instances resource.</summary>
        public virtual InstancesResource Instances
        {
            get { return instances; }
        }

        /// <summary>The "instances" collection of methods.</summary>
        public class InstancesResource
        {
            private const string Resource = "instances";

            /// <summary>The service which this resource belongs to.</summary>
            private readonly Google.Apis.Services.IClientService service;

            /// <summary>Constructs a new resource.</summary>
            public InstancesResource(Google.Apis.Services.IClientService service)
            {
                this.service = service;
                databases = new DatabasesResource(service);
                operations = new OperationsResource(service);

            }

            private readonly DatabasesResource databases;

            /// <summary>Gets the Databases resource.</summary>
            public virtual DatabasesResource Databases
            {
                get { return databases; }
            }

            /// <summary>The "databases" collection of methods.</summary>
            public class DatabasesResource
            {
                private const string Resource = "databases";

                /// <summary>The service which this resource belongs to.</summary>
                private readonly Google.Apis.Services.IClientService service;

                /// <summary>Constructs a new resource.</summary>
                public DatabasesResource(Google.Apis.Services.IClientService service)
                {
                    this.service = service;
                    operations = new OperationsResource(service);
                    sessions = new SessionsResource(service);

                }

                private readonly OperationsResource operations;

                /// <summary>Gets the Operations resource.</summary>
                public virtual OperationsResource Operations
                {
                    get { return operations; }
                }

                /// <summary>The "operations" collection of methods.</summary>
                public class OperationsResource
                {
                    private const string Resource = "operations";

                    /// <summary>The service which this resource belongs to.</summary>
                    private readonly Google.Apis.Services.IClientService service;

                    /// <summary>Constructs a new resource.</summary>
                    public OperationsResource(Google.Apis.Services.IClientService service)
                    {
                        this.service = service;

                    }


                    /// <summary>Starts asynchronous cancellation on a long-running operation.  The server makes a best
                    /// effort to cancel the operation, but success is not guaranteed.  If the server doesn't support
                    /// this method, it returns `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
                    /// Operations.GetOperation or other methods to check whether the cancellation succeeded or whether
                    /// the operation completed despite cancellation. On successful cancellation, the operation is not
                    /// deleted; instead, it becomes an operation with an Operation.error value with a
                    /// google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.</summary>
                    /// <param name="name">The name of the operation resource to be cancelled.</param>
                    public virtual CancelRequest Cancel(string name)
                    {
                        return new CancelRequest(service, name);
                    }

                    /// <summary>Starts asynchronous cancellation on a long-running operation.  The server makes a best
                    /// effort to cancel the operation, but success is not guaranteed.  If the server doesn't support
                    /// this method, it returns `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
                    /// Operations.GetOperation or other methods to check whether the cancellation succeeded or whether
                    /// the operation completed despite cancellation. On successful cancellation, the operation is not
                    /// deleted; instead, it becomes an operation with an Operation.error value with a
                    /// google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.</summary>
                    public class CancelRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                    {
                        /// <summary>Constructs a new Cancel request.</summary>
                        public CancelRequest(Google.Apis.Services.IClientService service, string name)
                            : base(service)
                        {
                            Name = name;
                            InitParameters();
                        }


                        /// <summary>The name of the operation resource to be cancelled.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Name { get; private set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "cancel"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+name}:cancel"; }
                        }

                        /// <summary>Initializes Cancel parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "name", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "name",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/operations/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Deletes a long-running operation. This method indicates that the client is no longer
                    /// interested in the operation result. It does not cancel the operation. If the server doesn't
                    /// support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.</summary>
                    /// <param name="name">The name of the operation resource to be deleted.</param>
                    public virtual DeleteRequest Delete(string name)
                    {
                        return new DeleteRequest(service, name);
                    }

                    /// <summary>Deletes a long-running operation. This method indicates that the client is no longer
                    /// interested in the operation result. It does not cancel the operation. If the server doesn't
                    /// support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.</summary>
                    public class DeleteRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                    {
                        /// <summary>Constructs a new Delete request.</summary>
                        public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                            : base(service)
                        {
                            Name = name;
                            InitParameters();
                        }


                        /// <summary>The name of the operation resource to be deleted.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Name { get; private set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "delete"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "DELETE"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+name}"; }
                        }

                        /// <summary>Initializes Delete parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "name", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "name",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/operations/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Gets the latest state of a long-running operation.  Clients can use this method to poll
                    /// the operation result at intervals as recommended by the API service.</summary>
                    /// <param name="name">The name of the operation resource.</param>
                    public virtual GetRequest Get(string name)
                    {
                        return new GetRequest(service, name);
                    }

                    /// <summary>Gets the latest state of a long-running operation.  Clients can use this method to poll
                    /// the operation result at intervals as recommended by the API service.</summary>
                    public class GetRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Operation>
                    {
                        /// <summary>Constructs a new Get request.</summary>
                        public GetRequest(Google.Apis.Services.IClientService service, string name)
                            : base(service)
                        {
                            Name = name;
                            InitParameters();
                        }


                        /// <summary>The name of the operation resource.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Name { get; private set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "get"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "GET"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+name}"; }
                        }

                        /// <summary>Initializes Get parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "name", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "name",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/operations/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Lists operations that match the specified filter in the request. If the server doesn't
                    /// support this method, it returns `UNIMPLEMENTED`.
                    ///
                    /// NOTE: the `name` binding below allows API services to override the binding to use different
                    /// resource name schemes, such as `users/operations`.</summary>
                    /// <param name="name">The name of the operation collection.</param>
                    public virtual ListRequest List(string name)
                    {
                        return new ListRequest(service, name);
                    }

                    /// <summary>Lists operations that match the specified filter in the request. If the server doesn't
                    /// support this method, it returns `UNIMPLEMENTED`.
                    ///
                    /// NOTE: the `name` binding below allows API services to override the binding to use different
                    /// resource name schemes, such as `users/operations`.</summary>
                    public class ListRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ListOperationsResponse>
                    {
                        /// <summary>Constructs a new List request.</summary>
                        public ListRequest(Google.Apis.Services.IClientService service, string name)
                            : base(service)
                        {
                            Name = name;
                            InitParameters();
                        }


                        /// <summary>The name of the operation collection.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Name { get; private set; }

                        /// <summary>The standard list filter.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                        public virtual string Filter { get; set; }

                        /// <summary>The standard list page token.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                        public virtual string PageToken { get; set; }

                        /// <summary>The standard list page size.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                        public virtual System.Nullable<int> PageSize { get; set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "list"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "GET"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+name}"; }
                        }

                        /// <summary>Initializes List parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "name", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "name",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/operations$",
                                });
                            RequestParameters.Add(
                                "filter", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "filter",
                                    IsRequired = false,
                                    ParameterType = "query",
                                    DefaultValue = null,
                                    Pattern = null,
                                });
                            RequestParameters.Add(
                                "pageToken", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "pageToken",
                                    IsRequired = false,
                                    ParameterType = "query",
                                    DefaultValue = null,
                                    Pattern = null,
                                });
                            RequestParameters.Add(
                                "pageSize", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "pageSize",
                                    IsRequired = false,
                                    ParameterType = "query",
                                    DefaultValue = null,
                                    Pattern = null,
                                });
                        }

                    }
                }
                private readonly SessionsResource sessions;

                /// <summary>Gets the Sessions resource.</summary>
                public virtual SessionsResource Sessions
                {
                    get { return sessions; }
                }

                /// <summary>The "sessions" collection of methods.</summary>
                public class SessionsResource
                {
                    private const string Resource = "sessions";

                    /// <summary>The service which this resource belongs to.</summary>
                    private readonly Google.Apis.Services.IClientService service;

                    /// <summary>Constructs a new resource.</summary>
                    public SessionsResource(Google.Apis.Services.IClientService service)
                    {
                        this.service = service;

                    }


                    /// <summary>Begins a new transaction. This step can often be skipped: Read, ExecuteSql and Commit
                    /// can begin a new transaction as a side-effect.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the transaction runs.</param>
                    public virtual BeginTransactionRequest BeginTransaction(Google.Apis.Spanner.v1.Data.BeginTransactionRequest body, string session)
                    {
                        return new BeginTransactionRequest(service, body, session);
                    }

                    /// <summary>Begins a new transaction. This step can often be skipped: Read, ExecuteSql and Commit
                    /// can begin a new transaction as a side-effect.</summary>
                    public class BeginTransactionRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Transaction>
                    {
                        /// <summary>Constructs a new BeginTransaction request.</summary>
                        public BeginTransactionRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.BeginTransactionRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the transaction runs.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.BeginTransactionRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "beginTransaction"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:beginTransaction"; }
                        }

                        /// <summary>Initializes BeginTransaction parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Commits a transaction. The request includes the mutations to be applied to rows in the
                    /// database.
                    ///
                    /// `Commit` might return an `ABORTED` error. This can occur at any time; commonly, the cause is
                    /// conflicts with concurrent transactions. However, it can also happen for a variety of other
                    /// reasons. If `Commit` returns `ABORTED`, the caller should re-attempt the transaction from the
                    /// beginning, re-using the same session.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the transaction to be committed is running.</param>
                    public virtual CommitRequest Commit(Google.Apis.Spanner.v1.Data.CommitRequest body, string session)
                    {
                        return new CommitRequest(service, body, session);
                    }

                    /// <summary>Commits a transaction. The request includes the mutations to be applied to rows in the
                    /// database.
                    ///
                    /// `Commit` might return an `ABORTED` error. This can occur at any time; commonly, the cause is
                    /// conflicts with concurrent transactions. However, it can also happen for a variety of other
                    /// reasons. If `Commit` returns `ABORTED`, the caller should re-attempt the transaction from the
                    /// beginning, re-using the same session.</summary>
                    public class CommitRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.CommitResponse>
                    {
                        /// <summary>Constructs a new Commit request.</summary>
                        public CommitRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.CommitRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the transaction to be committed is
                        /// running.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.CommitRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "commit"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:commit"; }
                        }

                        /// <summary>Initializes Commit parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Creates a new session. A session can be used to perform transactions that read and/or
                    /// modify data in a Cloud Spanner database. Sessions are meant to be reused for many consecutive
                    /// transactions.
                    ///
                    /// Sessions can only execute one transaction at a time. To execute multiple concurrent read-write
                    /// /write-only transactions, create multiple sessions. Note that standalone reads and queries use a
                    /// transaction internally, and count toward the one transaction limit.
                    ///
                    /// Cloud Spanner limits the number of sessions that can exist at any given time; thus, it is a good
                    /// idea to delete idle and/or unneeded sessions. Aside from explicit deletes, Cloud Spanner can
                    /// delete sessions for which no operations are sent for more than an hour. If a session is deleted,
                    /// requests to it return `NOT_FOUND`.
                    ///
                    /// Idle sessions can be kept alive by sending a trivial SQL query periodically, e.g., `"SELECT
                    /// 1"`.</summary>
                    /// <param name="database">Required. The database in which the new session is created.</param>
                    public virtual CreateRequest Create(string database)
                    {
                        return new CreateRequest(service, database);
                    }

                    /// <summary>Creates a new session. A session can be used to perform transactions that read and/or
                    /// modify data in a Cloud Spanner database. Sessions are meant to be reused for many consecutive
                    /// transactions.
                    ///
                    /// Sessions can only execute one transaction at a time. To execute multiple concurrent read-write
                    /// /write-only transactions, create multiple sessions. Note that standalone reads and queries use a
                    /// transaction internally, and count toward the one transaction limit.
                    ///
                    /// Cloud Spanner limits the number of sessions that can exist at any given time; thus, it is a good
                    /// idea to delete idle and/or unneeded sessions. Aside from explicit deletes, Cloud Spanner can
                    /// delete sessions for which no operations are sent for more than an hour. If a session is deleted,
                    /// requests to it return `NOT_FOUND`.
                    ///
                    /// Idle sessions can be kept alive by sending a trivial SQL query periodically, e.g., `"SELECT
                    /// 1"`.</summary>
                    public class CreateRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Session>
                    {
                        /// <summary>Constructs a new Create request.</summary>
                        public CreateRequest(Google.Apis.Services.IClientService service, string database)
                            : base(service)
                        {
                            Database = database;
                            InitParameters();
                        }


                        /// <summary>Required. The database in which the new session is created.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("database", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Database { get; private set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "create"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+database}/sessions"; }
                        }

                        /// <summary>Initializes Create parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "database", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "database",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Ends a session, releasing server resources associated with it.</summary>
                    /// <param name="name">Required. The name of the session to delete.</param>
                    public virtual DeleteRequest Delete(string name)
                    {
                        return new DeleteRequest(service, name);
                    }

                    /// <summary>Ends a session, releasing server resources associated with it.</summary>
                    public class DeleteRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                    {
                        /// <summary>Constructs a new Delete request.</summary>
                        public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                            : base(service)
                        {
                            Name = name;
                            InitParameters();
                        }


                        /// <summary>Required. The name of the session to delete.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Name { get; private set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "delete"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "DELETE"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+name}"; }
                        }

                        /// <summary>Initializes Delete parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "name", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "name",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Executes an SQL query, returning all rows in a single reply. This method cannot be used
                    /// to return a result set larger than 10 MiB; if the query yields more data than that, the query
                    /// fails with a `FAILED_PRECONDITION` error.
                    ///
                    /// Queries inside read-write transactions might return `ABORTED`. If this occurs, the application
                    /// should restart the transaction from the beginning. See Transaction for more details.
                    ///
                    /// Larger result sets can be fetched in streaming fashion by calling ExecuteStreamingSql
                    /// instead.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the SQL query should be performed.</param>
                    public virtual ExecuteSqlRequest ExecuteSql(Google.Apis.Spanner.v1.Data.ExecuteSqlRequest body, string session)
                    {
                        return new ExecuteSqlRequest(service, body, session);
                    }

                    /// <summary>Executes an SQL query, returning all rows in a single reply. This method cannot be used
                    /// to return a result set larger than 10 MiB; if the query yields more data than that, the query
                    /// fails with a `FAILED_PRECONDITION` error.
                    ///
                    /// Queries inside read-write transactions might return `ABORTED`. If this occurs, the application
                    /// should restart the transaction from the beginning. See Transaction for more details.
                    ///
                    /// Larger result sets can be fetched in streaming fashion by calling ExecuteStreamingSql
                    /// instead.</summary>
                    public class ExecuteSqlRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ResultSet>
                    {
                        /// <summary>Constructs a new ExecuteSql request.</summary>
                        public ExecuteSqlRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.ExecuteSqlRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the SQL query should be performed.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.ExecuteSqlRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "executeSql"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:executeSql"; }
                        }

                        /// <summary>Initializes ExecuteSql parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Like ExecuteSql, except returns the result set as a stream. Unlike ExecuteSql, there is
                    /// no limit on the size of the returned result set. However, no individual row in the result set
                    /// can exceed 100 MiB, and no column value can exceed 10 MiB.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the SQL query should be performed.</param>
                    public virtual ExecuteStreamingSqlRequest ExecuteStreamingSql(Google.Apis.Spanner.v1.Data.ExecuteSqlRequest body, string session)
                    {
                        return new ExecuteStreamingSqlRequest(service, body, session);
                    }

                    /// <summary>Like ExecuteSql, except returns the result set as a stream. Unlike ExecuteSql, there is
                    /// no limit on the size of the returned result set. However, no individual row in the result set
                    /// can exceed 100 MiB, and no column value can exceed 10 MiB.</summary>
                    public class ExecuteStreamingSqlRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.PartialResultSet>
                    {
                        /// <summary>Constructs a new ExecuteStreamingSql request.</summary>
                        public ExecuteStreamingSqlRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.ExecuteSqlRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the SQL query should be performed.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.ExecuteSqlRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "executeStreamingSql"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:executeStreamingSql"; }
                        }

                        /// <summary>Initializes ExecuteStreamingSql parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Gets a session. Returns `NOT_FOUND` if the session does not exist. This is mainly
                    /// useful for determining whether a session is still alive.</summary>
                    /// <param name="name">Required. The name of the session to retrieve.</param>
                    public virtual GetRequest Get(string name)
                    {
                        return new GetRequest(service, name);
                    }

                    /// <summary>Gets a session. Returns `NOT_FOUND` if the session does not exist. This is mainly
                    /// useful for determining whether a session is still alive.</summary>
                    public class GetRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Session>
                    {
                        /// <summary>Constructs a new Get request.</summary>
                        public GetRequest(Google.Apis.Services.IClientService service, string name)
                            : base(service)
                        {
                            Name = name;
                            InitParameters();
                        }


                        /// <summary>Required. The name of the session to retrieve.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Name { get; private set; }


                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "get"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "GET"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+name}"; }
                        }

                        /// <summary>Initializes Get parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "name", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "name",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Reads rows from the database using key lookups and scans, as a simple key/value style
                    /// alternative to ExecuteSql.  This method cannot be used to return a result set larger than 10
                    /// MiB; if the read matches more data than that, the read fails with a `FAILED_PRECONDITION` error.
                    ///
                    /// Reads inside read-write transactions might return `ABORTED`. If this occurs, the application
                    /// should restart the transaction from the beginning. See Transaction for more details.
                    ///
                    /// Larger result sets can be yielded in streaming fashion by calling StreamingRead
                    /// instead.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the read should be performed.</param>
                    public virtual ReadRequest Read(Google.Apis.Spanner.v1.Data.ReadRequest body, string session)
                    {
                        return new ReadRequest(service, body, session);
                    }

                    /// <summary>Reads rows from the database using key lookups and scans, as a simple key/value style
                    /// alternative to ExecuteSql.  This method cannot be used to return a result set larger than 10
                    /// MiB; if the read matches more data than that, the read fails with a `FAILED_PRECONDITION` error.
                    ///
                    /// Reads inside read-write transactions might return `ABORTED`. If this occurs, the application
                    /// should restart the transaction from the beginning. See Transaction for more details.
                    ///
                    /// Larger result sets can be yielded in streaming fashion by calling StreamingRead
                    /// instead.</summary>
                    public class ReadRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ResultSet>
                    {
                        /// <summary>Constructs a new Read request.</summary>
                        public ReadRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.ReadRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the read should be performed.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.ReadRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "read"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:read"; }
                        }

                        /// <summary>Initializes Read parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Rolls back a transaction, releasing any locks it holds. It is a good idea to call this
                    /// for any transaction that includes one or more Read or ExecuteSql requests and ultimately decides
                    /// not to commit.
                    ///
                    /// `Rollback` returns `OK` if it successfully aborts the transaction, the transaction was already
                    /// aborted, or the transaction is not found. `Rollback` never returns `ABORTED`.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the transaction to roll back is running.</param>
                    public virtual RollbackRequest Rollback(Google.Apis.Spanner.v1.Data.RollbackRequest body, string session)
                    {
                        return new RollbackRequest(service, body, session);
                    }

                    /// <summary>Rolls back a transaction, releasing any locks it holds. It is a good idea to call this
                    /// for any transaction that includes one or more Read or ExecuteSql requests and ultimately decides
                    /// not to commit.
                    ///
                    /// `Rollback` returns `OK` if it successfully aborts the transaction, the transaction was already
                    /// aborted, or the transaction is not found. `Rollback` never returns `ABORTED`.</summary>
                    public class RollbackRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                    {
                        /// <summary>Constructs a new Rollback request.</summary>
                        public RollbackRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.RollbackRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the transaction to roll back is running.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.RollbackRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "rollback"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:rollback"; }
                        }

                        /// <summary>Initializes Rollback parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }

                    /// <summary>Like Read, except returns the result set as a stream. Unlike Read, there is no limit on
                    /// the size of the returned result set. However, no individual row in the result set can exceed 100
                    /// MiB, and no column value can exceed 10 MiB.</summary>
                    /// <param name="body">The body of the request.</param>
                    /// <param name="session">Required. The session in which the read should be performed.</param>
                    public virtual StreamingReadRequest StreamingRead(Google.Apis.Spanner.v1.Data.ReadRequest body, string session)
                    {
                        return new StreamingReadRequest(service, body, session);
                    }

                    /// <summary>Like Read, except returns the result set as a stream. Unlike Read, there is no limit on
                    /// the size of the returned result set. However, no individual row in the result set can exceed 100
                    /// MiB, and no column value can exceed 10 MiB.</summary>
                    public class StreamingReadRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.PartialResultSet>
                    {
                        /// <summary>Constructs a new StreamingRead request.</summary>
                        public StreamingReadRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.ReadRequest body, string session)
                            : base(service)
                        {
                            Session = session;
                            Body = body;
                            InitParameters();
                        }


                        /// <summary>Required. The session in which the read should be performed.</summary>
                        [Google.Apis.Util.RequestParameterAttribute("session", Google.Apis.Util.RequestParameterType.Path)]
                        public virtual string Session { get; private set; }


                        /// <summary>Gets or sets the body of this request.</summary>
                        Google.Apis.Spanner.v1.Data.ReadRequest Body { get; set; }

                        ///<summary>Returns the body of the request.</summary>
                        protected override object GetBody() { return Body; }

                        ///<summary>Gets the method name.</summary>
                        public override string MethodName
                        {
                            get { return "streamingRead"; }
                        }

                        ///<summary>Gets the HTTP method.</summary>
                        public override string HttpMethod
                        {
                            get { return "POST"; }
                        }

                        ///<summary>Gets the REST path.</summary>
                        public override string RestPath
                        {
                            get { return "v1/{+session}:streamingRead"; }
                        }

                        /// <summary>Initializes StreamingRead parameter list.</summary>
                        protected override void InitParameters()
                        {
                            base.InitParameters();

                            RequestParameters.Add(
                                "session", new Google.Apis.Discovery.Parameter
                                {
                                    Name = "session",
                                    IsRequired = true,
                                    ParameterType = "path",
                                    DefaultValue = null,
                                    Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+/sessions/[^/]+$",
                                });
                        }

                    }
                }

                /// <summary>Creates a new Cloud Spanner database and starts to prepare it for serving. The returned
                /// long-running operation will have a name of the format `/operations/` and can be used to track
                /// preparation of the database. The metadata field type is CreateDatabaseMetadata. The response field
                /// type is Database, if successful.</summary>
                /// <param name="body">The body of the request.</param>
                /// <param name="parent">Required. The name of the instance that will serve the new database. Values are of the form
                /// `projects//instances/`.</param>
                public virtual CreateRequest Create(Google.Apis.Spanner.v1.Data.CreateDatabaseRequest body, string parent)
                {
                    return new CreateRequest(service, body, parent);
                }

                /// <summary>Creates a new Cloud Spanner database and starts to prepare it for serving. The returned
                /// long-running operation will have a name of the format `/operations/` and can be used to track
                /// preparation of the database. The metadata field type is CreateDatabaseMetadata. The response field
                /// type is Database, if successful.</summary>
                public class CreateRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Operation>
                {
                    /// <summary>Constructs a new Create request.</summary>
                    public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.CreateDatabaseRequest body, string parent)
                        : base(service)
                    {
                        Parent = parent;
                        Body = body;
                        InitParameters();
                    }


                    /// <summary>Required. The name of the instance that will serve the new database. Values are of the
                    /// form `projects//instances/`.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("parent", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Parent { get; private set; }


                    /// <summary>Gets or sets the body of this request.</summary>
                    Google.Apis.Spanner.v1.Data.CreateDatabaseRequest Body { get; set; }

                    ///<summary>Returns the body of the request.</summary>
                    protected override object GetBody() { return Body; }

                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "create"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "POST"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+parent}/databases"; }
                    }

                    /// <summary>Initializes Create parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "parent", new Google.Apis.Discovery.Parameter
                            {
                                Name = "parent",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+$",
                            });
                    }

                }

                /// <summary>Drops (aka deletes) a Cloud Spanner database.</summary>
                /// <param name="database">Required. The database to be dropped.</param>
                public virtual DropDatabaseRequest DropDatabase(string database)
                {
                    return new DropDatabaseRequest(service, database);
                }

                /// <summary>Drops (aka deletes) a Cloud Spanner database.</summary>
                public class DropDatabaseRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                {
                    /// <summary>Constructs a new DropDatabase request.</summary>
                    public DropDatabaseRequest(Google.Apis.Services.IClientService service, string database)
                        : base(service)
                    {
                        Database = database;
                        InitParameters();
                    }


                    /// <summary>Required. The database to be dropped.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("database", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Database { get; private set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "dropDatabase"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "DELETE"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+database}"; }
                    }

                    /// <summary>Initializes DropDatabase parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "database", new Google.Apis.Discovery.Parameter
                            {
                                Name = "database",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }

                /// <summary>Gets the state of a Cloud Spanner database.</summary>
                /// <param name="name">Required. The name of the requested database. Values are of the form
                /// `projects//instances//databases/`.</param>
                public virtual GetRequest Get(string name)
                {
                    return new GetRequest(service, name);
                }

                /// <summary>Gets the state of a Cloud Spanner database.</summary>
                public class GetRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Database>
                {
                    /// <summary>Constructs a new Get request.</summary>
                    public GetRequest(Google.Apis.Services.IClientService service, string name)
                        : base(service)
                    {
                        Name = name;
                        InitParameters();
                    }


                    /// <summary>Required. The name of the requested database. Values are of the form
                    /// `projects//instances//databases/`.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Name { get; private set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "get"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "GET"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+name}"; }
                    }

                    /// <summary>Initializes Get parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "name", new Google.Apis.Discovery.Parameter
                            {
                                Name = "name",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }

                /// <summary>Returns the schema of a Cloud Spanner database as a list of formatted DDL statements. This
                /// method does not show pending schema updates, those may be queried using the Operations
                /// API.</summary>
                /// <param name="database">Required. The database whose schema we wish to get.</param>
                public virtual GetDdlRequest GetDdl(string database)
                {
                    return new GetDdlRequest(service, database);
                }

                /// <summary>Returns the schema of a Cloud Spanner database as a list of formatted DDL statements. This
                /// method does not show pending schema updates, those may be queried using the Operations
                /// API.</summary>
                public class GetDdlRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.GetDatabaseDdlResponse>
                {
                    /// <summary>Constructs a new GetDdl request.</summary>
                    public GetDdlRequest(Google.Apis.Services.IClientService service, string database)
                        : base(service)
                    {
                        Database = database;
                        InitParameters();
                    }


                    /// <summary>Required. The database whose schema we wish to get.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("database", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Database { get; private set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "getDdl"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "GET"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+database}/ddl"; }
                    }

                    /// <summary>Initializes GetDdl parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "database", new Google.Apis.Discovery.Parameter
                            {
                                Name = "database",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }

                /// <summary>Gets the access control policy for a database resource. Returns an empty policy if a
                /// database exists but does not have a policy set.
                ///
                /// Authorization requires `spanner.databases.getIamPolicy` permission on resource.</summary>
                /// <param name="body">The body of the request.</param>
                /// <param name="resource">REQUIRED: The Cloud Spanner resource for which the policy is being retrieved. The format is
                /// `projects//instances/` for instance resources and `projects//instances//databases/` for database
                /// resources.</param>
                public virtual GetIamPolicyRequest GetIamPolicy(Google.Apis.Spanner.v1.Data.GetIamPolicyRequest body, string resource)
                {
                    return new GetIamPolicyRequest(service, body, resource);
                }

                /// <summary>Gets the access control policy for a database resource. Returns an empty policy if a
                /// database exists but does not have a policy set.
                ///
                /// Authorization requires `spanner.databases.getIamPolicy` permission on resource.</summary>
                public class GetIamPolicyRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Policy>
                {
                    /// <summary>Constructs a new GetIamPolicy request.</summary>
                    public GetIamPolicyRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.GetIamPolicyRequest body, string resource)
                        : base(service)
                    {
                        Resource = resource;
                        Body = body;
                        InitParameters();
                    }


                    /// <summary>REQUIRED: The Cloud Spanner resource for which the policy is being retrieved. The
                    /// format is `projects//instances/` for instance resources and `projects//instances//databases/`
                    /// for database resources.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("resource", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Resource { get; private set; }


                    /// <summary>Gets or sets the body of this request.</summary>
                    Google.Apis.Spanner.v1.Data.GetIamPolicyRequest Body { get; set; }

                    ///<summary>Returns the body of the request.</summary>
                    protected override object GetBody() { return Body; }

                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "getIamPolicy"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "POST"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+resource}:getIamPolicy"; }
                    }

                    /// <summary>Initializes GetIamPolicy parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "resource", new Google.Apis.Discovery.Parameter
                            {
                                Name = "resource",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }

                /// <summary>Lists Cloud Spanner databases.</summary>
                /// <param name="parent">Required. The instance whose databases should be listed. Values are of the form
                /// `projects//instances/`.</param>
                public virtual ListRequest List(string parent)
                {
                    return new ListRequest(service, parent);
                }

                /// <summary>Lists Cloud Spanner databases.</summary>
                public class ListRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ListDatabasesResponse>
                {
                    /// <summary>Constructs a new List request.</summary>
                    public ListRequest(Google.Apis.Services.IClientService service, string parent)
                        : base(service)
                    {
                        Parent = parent;
                        InitParameters();
                    }


                    /// <summary>Required. The instance whose databases should be listed. Values are of the form
                    /// `projects//instances/`.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("parent", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Parent { get; private set; }

                    /// <summary>If non-empty, `page_token` should contain a next_page_token from a previous
                    /// ListDatabasesResponse.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual string PageToken { get; set; }

                    /// <summary>Number of databases to be returned in the response. If 0 or less, defaults to the
                    /// server's maximum allowed page size.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual System.Nullable<int> PageSize { get; set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "list"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "GET"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+parent}/databases"; }
                    }

                    /// <summary>Initializes List parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "parent", new Google.Apis.Discovery.Parameter
                            {
                                Name = "parent",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+$",
                            });
                        RequestParameters.Add(
                            "pageToken", new Google.Apis.Discovery.Parameter
                            {
                                Name = "pageToken",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "pageSize", new Google.Apis.Discovery.Parameter
                            {
                                Name = "pageSize",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                    }

                }

                /// <summary>Sets the access control policy on a database resource. Replaces any existing policy.
                ///
                /// Authorization requires `spanner.databases.setIamPolicy` permission on resource.</summary>
                /// <param name="body">The body of the request.</param>
                /// <param name="resource">REQUIRED: The Cloud Spanner resource for which the policy is being set. The format is
                /// `projects//instances/` for instance resources and `projects//instances//databases/` for databases
                /// resources.</param>
                public virtual SetIamPolicyRequest SetIamPolicy(Google.Apis.Spanner.v1.Data.SetIamPolicyRequest body, string resource)
                {
                    return new SetIamPolicyRequest(service, body, resource);
                }

                /// <summary>Sets the access control policy on a database resource. Replaces any existing policy.
                ///
                /// Authorization requires `spanner.databases.setIamPolicy` permission on resource.</summary>
                public class SetIamPolicyRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Policy>
                {
                    /// <summary>Constructs a new SetIamPolicy request.</summary>
                    public SetIamPolicyRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.SetIamPolicyRequest body, string resource)
                        : base(service)
                    {
                        Resource = resource;
                        Body = body;
                        InitParameters();
                    }


                    /// <summary>REQUIRED: The Cloud Spanner resource for which the policy is being set. The format is
                    /// `projects//instances/` for instance resources and `projects//instances//databases/` for
                    /// databases resources.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("resource", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Resource { get; private set; }


                    /// <summary>Gets or sets the body of this request.</summary>
                    Google.Apis.Spanner.v1.Data.SetIamPolicyRequest Body { get; set; }

                    ///<summary>Returns the body of the request.</summary>
                    protected override object GetBody() { return Body; }

                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "setIamPolicy"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "POST"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+resource}:setIamPolicy"; }
                    }

                    /// <summary>Initializes SetIamPolicy parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "resource", new Google.Apis.Discovery.Parameter
                            {
                                Name = "resource",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }

                /// <summary>Returns permissions that the caller has on the specified database resource.
                ///
                /// Attempting this RPC on a non-existent Cloud Spanner database will result in a NOT_FOUND error if the
                /// user has `spanner.databases.list` permission on the containing Cloud Spanner instance. Otherwise
                /// returns an empty set of permissions.</summary>
                /// <param name="body">The body of the request.</param>
                /// <param name="resource">REQUIRED: The Cloud Spanner resource for which permissions are being tested. The format is
                /// `projects//instances/` for instance resources and `projects//instances//databases/` for database
                /// resources.</param>
                public virtual TestIamPermissionsRequest TestIamPermissions(Google.Apis.Spanner.v1.Data.TestIamPermissionsRequest body, string resource)
                {
                    return new TestIamPermissionsRequest(service, body, resource);
                }

                /// <summary>Returns permissions that the caller has on the specified database resource.
                ///
                /// Attempting this RPC on a non-existent Cloud Spanner database will result in a NOT_FOUND error if the
                /// user has `spanner.databases.list` permission on the containing Cloud Spanner instance. Otherwise
                /// returns an empty set of permissions.</summary>
                public class TestIamPermissionsRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.TestIamPermissionsResponse>
                {
                    /// <summary>Constructs a new TestIamPermissions request.</summary>
                    public TestIamPermissionsRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.TestIamPermissionsRequest body, string resource)
                        : base(service)
                    {
                        Resource = resource;
                        Body = body;
                        InitParameters();
                    }


                    /// <summary>REQUIRED: The Cloud Spanner resource for which permissions are being tested. The format
                    /// is `projects//instances/` for instance resources and `projects//instances//databases/` for
                    /// database resources.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("resource", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Resource { get; private set; }


                    /// <summary>Gets or sets the body of this request.</summary>
                    Google.Apis.Spanner.v1.Data.TestIamPermissionsRequest Body { get; set; }

                    ///<summary>Returns the body of the request.</summary>
                    protected override object GetBody() { return Body; }

                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "testIamPermissions"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "POST"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+resource}:testIamPermissions"; }
                    }

                    /// <summary>Initializes TestIamPermissions parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "resource", new Google.Apis.Discovery.Parameter
                            {
                                Name = "resource",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }

                /// <summary>Updates the schema of a Cloud Spanner database by creating/altering/dropping tables,
                /// columns, indexes, etc. The returned long-running operation will have a name of the format
                /// `/operations/` and can be used to track execution of the schema change(s). The metadata field type
                /// is UpdateDatabaseDdlMetadata.  The operation has no response.</summary>
                /// <param name="body">The body of the request.</param>
                /// <param name="database">Required. The database to update.</param>
                public virtual UpdateDdlRequest UpdateDdl(Google.Apis.Spanner.v1.Data.UpdateDatabaseDdlRequest body, string database)
                {
                    return new UpdateDdlRequest(service, body, database);
                }

                /// <summary>Updates the schema of a Cloud Spanner database by creating/altering/dropping tables,
                /// columns, indexes, etc. The returned long-running operation will have a name of the format
                /// `/operations/` and can be used to track execution of the schema change(s). The metadata field type
                /// is UpdateDatabaseDdlMetadata.  The operation has no response.</summary>
                public class UpdateDdlRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Operation>
                {
                    /// <summary>Constructs a new UpdateDdl request.</summary>
                    public UpdateDdlRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.UpdateDatabaseDdlRequest body, string database)
                        : base(service)
                    {
                        Database = database;
                        Body = body;
                        InitParameters();
                    }


                    /// <summary>Required. The database to update.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("database", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Database { get; private set; }


                    /// <summary>Gets or sets the body of this request.</summary>
                    Google.Apis.Spanner.v1.Data.UpdateDatabaseDdlRequest Body { get; set; }

                    ///<summary>Returns the body of the request.</summary>
                    protected override object GetBody() { return Body; }

                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "updateDdl"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "PATCH"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+database}/ddl"; }
                    }

                    /// <summary>Initializes UpdateDdl parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "database", new Google.Apis.Discovery.Parameter
                            {
                                Name = "database",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/databases/[^/]+$",
                            });
                    }

                }
            }
            private readonly OperationsResource operations;

            /// <summary>Gets the Operations resource.</summary>
            public virtual OperationsResource Operations
            {
                get { return operations; }
            }

            /// <summary>The "operations" collection of methods.</summary>
            public class OperationsResource
            {
                private const string Resource = "operations";

                /// <summary>The service which this resource belongs to.</summary>
                private readonly Google.Apis.Services.IClientService service;

                /// <summary>Constructs a new resource.</summary>
                public OperationsResource(Google.Apis.Services.IClientService service)
                {
                    this.service = service;

                }


                /// <summary>Starts asynchronous cancellation on a long-running operation.  The server makes a best
                /// effort to cancel the operation, but success is not guaranteed.  If the server doesn't support this
                /// method, it returns `google.rpc.Code.UNIMPLEMENTED`.  Clients can use Operations.GetOperation or
                /// other methods to check whether the cancellation succeeded or whether the operation completed despite
                /// cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an
                /// operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to
                /// `Code.CANCELLED`.</summary>
                /// <param name="name">The name of the operation resource to be cancelled.</param>
                public virtual CancelRequest Cancel(string name)
                {
                    return new CancelRequest(service, name);
                }

                /// <summary>Starts asynchronous cancellation on a long-running operation.  The server makes a best
                /// effort to cancel the operation, but success is not guaranteed.  If the server doesn't support this
                /// method, it returns `google.rpc.Code.UNIMPLEMENTED`.  Clients can use Operations.GetOperation or
                /// other methods to check whether the cancellation succeeded or whether the operation completed despite
                /// cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an
                /// operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to
                /// `Code.CANCELLED`.</summary>
                public class CancelRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                {
                    /// <summary>Constructs a new Cancel request.</summary>
                    public CancelRequest(Google.Apis.Services.IClientService service, string name)
                        : base(service)
                    {
                        Name = name;
                        InitParameters();
                    }


                    /// <summary>The name of the operation resource to be cancelled.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Name { get; private set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "cancel"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "POST"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+name}:cancel"; }
                    }

                    /// <summary>Initializes Cancel parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "name", new Google.Apis.Discovery.Parameter
                            {
                                Name = "name",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/operations/[^/]+$",
                            });
                    }

                }

                /// <summary>Deletes a long-running operation. This method indicates that the client is no longer
                /// interested in the operation result. It does not cancel the operation. If the server doesn't support
                /// this method, it returns `google.rpc.Code.UNIMPLEMENTED`.</summary>
                /// <param name="name">The name of the operation resource to be deleted.</param>
                public virtual DeleteRequest Delete(string name)
                {
                    return new DeleteRequest(service, name);
                }

                /// <summary>Deletes a long-running operation. This method indicates that the client is no longer
                /// interested in the operation result. It does not cancel the operation. If the server doesn't support
                /// this method, it returns `google.rpc.Code.UNIMPLEMENTED`.</summary>
                public class DeleteRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
                {
                    /// <summary>Constructs a new Delete request.</summary>
                    public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                        : base(service)
                    {
                        Name = name;
                        InitParameters();
                    }


                    /// <summary>The name of the operation resource to be deleted.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Name { get; private set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "delete"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "DELETE"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+name}"; }
                    }

                    /// <summary>Initializes Delete parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "name", new Google.Apis.Discovery.Parameter
                            {
                                Name = "name",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/operations/[^/]+$",
                            });
                    }

                }

                /// <summary>Gets the latest state of a long-running operation.  Clients can use this method to poll the
                /// operation result at intervals as recommended by the API service.</summary>
                /// <param name="name">The name of the operation resource.</param>
                public virtual GetRequest Get(string name)
                {
                    return new GetRequest(service, name);
                }

                /// <summary>Gets the latest state of a long-running operation.  Clients can use this method to poll the
                /// operation result at intervals as recommended by the API service.</summary>
                public class GetRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Operation>
                {
                    /// <summary>Constructs a new Get request.</summary>
                    public GetRequest(Google.Apis.Services.IClientService service, string name)
                        : base(service)
                    {
                        Name = name;
                        InitParameters();
                    }


                    /// <summary>The name of the operation resource.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Name { get; private set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "get"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "GET"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+name}"; }
                    }

                    /// <summary>Initializes Get parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "name", new Google.Apis.Discovery.Parameter
                            {
                                Name = "name",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/operations/[^/]+$",
                            });
                    }

                }

                /// <summary>Lists operations that match the specified filter in the request. If the server doesn't
                /// support this method, it returns `UNIMPLEMENTED`.
                ///
                /// NOTE: the `name` binding below allows API services to override the binding to use different resource
                /// name schemes, such as `users/operations`.</summary>
                /// <param name="name">The name of the operation collection.</param>
                public virtual ListRequest List(string name)
                {
                    return new ListRequest(service, name);
                }

                /// <summary>Lists operations that match the specified filter in the request. If the server doesn't
                /// support this method, it returns `UNIMPLEMENTED`.
                ///
                /// NOTE: the `name` binding below allows API services to override the binding to use different resource
                /// name schemes, such as `users/operations`.</summary>
                public class ListRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ListOperationsResponse>
                {
                    /// <summary>Constructs a new List request.</summary>
                    public ListRequest(Google.Apis.Services.IClientService service, string name)
                        : base(service)
                    {
                        Name = name;
                        InitParameters();
                    }


                    /// <summary>The name of the operation collection.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                    public virtual string Name { get; private set; }

                    /// <summary>The standard list filter.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual string Filter { get; set; }

                    /// <summary>The standard list page token.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual string PageToken { get; set; }

                    /// <summary>The standard list page size.</summary>
                    [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                    public virtual System.Nullable<int> PageSize { get; set; }


                    ///<summary>Gets the method name.</summary>
                    public override string MethodName
                    {
                        get { return "list"; }
                    }

                    ///<summary>Gets the HTTP method.</summary>
                    public override string HttpMethod
                    {
                        get { return "GET"; }
                    }

                    ///<summary>Gets the REST path.</summary>
                    public override string RestPath
                    {
                        get { return "v1/{+name}"; }
                    }

                    /// <summary>Initializes List parameter list.</summary>
                    protected override void InitParameters()
                    {
                        base.InitParameters();

                        RequestParameters.Add(
                            "name", new Google.Apis.Discovery.Parameter
                            {
                                Name = "name",
                                IsRequired = true,
                                ParameterType = "path",
                                DefaultValue = null,
                                Pattern = @"^projects/[^/]+/instances/[^/]+/operations$",
                            });
                        RequestParameters.Add(
                            "filter", new Google.Apis.Discovery.Parameter
                            {
                                Name = "filter",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "pageToken", new Google.Apis.Discovery.Parameter
                            {
                                Name = "pageToken",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                        RequestParameters.Add(
                            "pageSize", new Google.Apis.Discovery.Parameter
                            {
                                Name = "pageSize",
                                IsRequired = false,
                                ParameterType = "query",
                                DefaultValue = null,
                                Pattern = null,
                            });
                    }

                }
            }

            /// <summary>Creates an instance and begins preparing it to begin serving. The returned long-running
            /// operation can be used to track the progress of preparing the new instance. The instance name is assigned
            /// by the caller. If the named instance already exists, `CreateInstance` returns `ALREADY_EXISTS`.
            ///
            /// Immediately upon completion of this request:
            ///
            /// * The instance is readable via the API, with all requested attributes but no allocated resources. Its
            /// state is `CREATING`.
            ///
            /// Until completion of the returned operation:
            ///
            /// * Cancelling the operation renders the instance immediately unreadable via the API. * The instance can
            /// be deleted. * All other attempts to modify the instance are rejected.
            ///
            /// Upon completion of the returned operation:
            ///
            /// * Billing for all successfully-allocated resources begins (some types may have lower than the requested
            /// levels). * Databases can be created in the instance. * The instance's allocated resource levels are
            /// readable via the API. * The instance's state becomes `READY`.
            ///
            /// The returned long-running operation will have a name of the format `/operations/` and can be used to
            /// track creation of the instance.  The metadata field type is CreateInstanceMetadata. The response field
            /// type is Instance, if successful.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="parent">Required. The name of the project in which to create the instance. Values are of the form
            /// `projects/`.</param>
            public virtual CreateRequest Create(Google.Apis.Spanner.v1.Data.CreateInstanceRequest body, string parent)
            {
                return new CreateRequest(service, body, parent);
            }

            /// <summary>Creates an instance and begins preparing it to begin serving. The returned long-running
            /// operation can be used to track the progress of preparing the new instance. The instance name is assigned
            /// by the caller. If the named instance already exists, `CreateInstance` returns `ALREADY_EXISTS`.
            ///
            /// Immediately upon completion of this request:
            ///
            /// * The instance is readable via the API, with all requested attributes but no allocated resources. Its
            /// state is `CREATING`.
            ///
            /// Until completion of the returned operation:
            ///
            /// * Cancelling the operation renders the instance immediately unreadable via the API. * The instance can
            /// be deleted. * All other attempts to modify the instance are rejected.
            ///
            /// Upon completion of the returned operation:
            ///
            /// * Billing for all successfully-allocated resources begins (some types may have lower than the requested
            /// levels). * Databases can be created in the instance. * The instance's allocated resource levels are
            /// readable via the API. * The instance's state becomes `READY`.
            ///
            /// The returned long-running operation will have a name of the format `/operations/` and can be used to
            /// track creation of the instance.  The metadata field type is CreateInstanceMetadata. The response field
            /// type is Instance, if successful.</summary>
            public class CreateRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Operation>
            {
                /// <summary>Constructs a new Create request.</summary>
                public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.CreateInstanceRequest body, string parent)
                    : base(service)
                {
                    Parent = parent;
                    Body = body;
                    InitParameters();
                }


                /// <summary>Required. The name of the project in which to create the instance. Values are of the form
                /// `projects/`.</summary>
                [Google.Apis.Util.RequestParameterAttribute("parent", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Parent { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Spanner.v1.Data.CreateInstanceRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "create"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+parent}/instances"; }
                }

                /// <summary>Initializes Create parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "parent", new Google.Apis.Discovery.Parameter
                        {
                            Name = "parent",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                }

            }

            /// <summary>Deletes an instance.
            ///
            /// Immediately upon completion of the request:
            ///
            /// * Billing ceases for all of the instance's reserved resources.
            ///
            /// Soon afterward:
            ///
            /// * The instance and *all of its databases* immediately and irrevocably disappear from the API. All data
            /// in the databases is permanently deleted.</summary>
            /// <param name="name">Required. The name of the instance to be deleted. Values are of the form
            /// `projects//instances/`</param>
            public virtual DeleteRequest Delete(string name)
            {
                return new DeleteRequest(service, name);
            }

            /// <summary>Deletes an instance.
            ///
            /// Immediately upon completion of the request:
            ///
            /// * Billing ceases for all of the instance's reserved resources.
            ///
            /// Soon afterward:
            ///
            /// * The instance and *all of its databases* immediately and irrevocably disappear from the API. All data
            /// in the databases is permanently deleted.</summary>
            public class DeleteRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Empty>
            {
                /// <summary>Constructs a new Delete request.</summary>
                public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>Required. The name of the instance to be deleted. Values are of the form
                /// `projects//instances/`</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "delete"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "DELETE"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+name}"; }
                }

                /// <summary>Initializes Delete parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instances/[^/]+$",
                        });
                }

            }

            /// <summary>Gets information about a particular instance.</summary>
            /// <param name="name">Required. The name of the requested instance. Values are of the form
            /// `projects//instances/`.</param>
            public virtual GetRequest Get(string name)
            {
                return new GetRequest(service, name);
            }

            /// <summary>Gets information about a particular instance.</summary>
            public class GetRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Instance>
            {
                /// <summary>Constructs a new Get request.</summary>
                public GetRequest(Google.Apis.Services.IClientService service, string name)
                    : base(service)
                {
                    Name = name;
                    InitParameters();
                }


                /// <summary>Required. The name of the requested instance. Values are of the form
                /// `projects//instances/`.</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "get"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+name}"; }
                }

                /// <summary>Initializes Get parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instances/[^/]+$",
                        });
                }

            }

            /// <summary>Gets the access control policy for an instance resource. Returns an empty policy if an instance
            /// exists but does not have a policy set.
            ///
            /// Authorization requires `spanner.instances.getIamPolicy` on resource.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="resource">REQUIRED: The Cloud Spanner resource for which the policy is being retrieved. The format is
            /// `projects//instances/` for instance resources and `projects//instances//databases/` for database
            /// resources.</param>
            public virtual GetIamPolicyRequest GetIamPolicy(Google.Apis.Spanner.v1.Data.GetIamPolicyRequest body, string resource)
            {
                return new GetIamPolicyRequest(service, body, resource);
            }

            /// <summary>Gets the access control policy for an instance resource. Returns an empty policy if an instance
            /// exists but does not have a policy set.
            ///
            /// Authorization requires `spanner.instances.getIamPolicy` on resource.</summary>
            public class GetIamPolicyRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Policy>
            {
                /// <summary>Constructs a new GetIamPolicy request.</summary>
                public GetIamPolicyRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.GetIamPolicyRequest body, string resource)
                    : base(service)
                {
                    Resource = resource;
                    Body = body;
                    InitParameters();
                }


                /// <summary>REQUIRED: The Cloud Spanner resource for which the policy is being retrieved. The format is
                /// `projects//instances/` for instance resources and `projects//instances//databases/` for database
                /// resources.</summary>
                [Google.Apis.Util.RequestParameterAttribute("resource", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Resource { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Spanner.v1.Data.GetIamPolicyRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "getIamPolicy"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+resource}:getIamPolicy"; }
                }

                /// <summary>Initializes GetIamPolicy parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "resource", new Google.Apis.Discovery.Parameter
                        {
                            Name = "resource",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instances/[^/]+$",
                        });
                }

            }

            /// <summary>Lists all instances in the given project.</summary>
            /// <param name="parent">Required. The name of the project for which a list of instances is requested. Values are of the
            /// form `projects/`.</param>
            public virtual ListRequest List(string parent)
            {
                return new ListRequest(service, parent);
            }

            /// <summary>Lists all instances in the given project.</summary>
            public class ListRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.ListInstancesResponse>
            {
                /// <summary>Constructs a new List request.</summary>
                public ListRequest(Google.Apis.Services.IClientService service, string parent)
                    : base(service)
                {
                    Parent = parent;
                    InitParameters();
                }


                /// <summary>Required. The name of the project for which a list of instances is requested. Values are of
                /// the form `projects/`.</summary>
                [Google.Apis.Util.RequestParameterAttribute("parent", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Parent { get; private set; }

                /// <summary>An expression for filtering the results of the request. Filter rules are case insensitive.
                /// The fields eligible for filtering are:
                ///
                /// * name * display_name * labels.key where key is the name of a label
                ///
                /// Some examples of using filters are:
                ///
                /// * name:* --> The instance has a name. * name:Howl --> The instance's name contains the string
                /// "howl". * name:HOWL --> Equivalent to above. * NAME:howl --> Equivalent to above. * labels.env:* -->
                /// The instance has the label "env". * labels.env:dev --> The instance has the label "env" and the
                /// value of the label contains the string "dev". * name:howl labels.env:dev --> The instance's name
                /// contains "howl" and it has the label "env" with its value containing "dev".</summary>
                [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string Filter { get; set; }

                /// <summary>If non-empty, `page_token` should contain a next_page_token from a previous
                /// ListInstancesResponse.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
                public virtual string PageToken { get; set; }

                /// <summary>Number of instances to be returned in the response. If 0 or less, defaults to the server's
                /// maximum allowed page size.</summary>
                [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
                public virtual System.Nullable<int> PageSize { get; set; }


                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "list"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "GET"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+parent}/instances"; }
                }

                /// <summary>Initializes List parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "parent", new Google.Apis.Discovery.Parameter
                        {
                            Name = "parent",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+$",
                        });
                    RequestParameters.Add(
                        "filter", new Google.Apis.Discovery.Parameter
                        {
                            Name = "filter",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageToken", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageToken",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                    RequestParameters.Add(
                        "pageSize", new Google.Apis.Discovery.Parameter
                        {
                            Name = "pageSize",
                            IsRequired = false,
                            ParameterType = "query",
                            DefaultValue = null,
                            Pattern = null,
                        });
                }

            }

            /// <summary>Updates an instance, and begins allocating or releasing resources as requested. The returned
            /// long-running operation can be used to track the progress of updating the instance. If the named instance
            /// does not exist, returns `NOT_FOUND`.
            ///
            /// Immediately upon completion of this request:
            ///
            /// * For resource types for which a decrease in the instance's allocation has been requested, billing is
            /// based on the newly-requested level.
            ///
            /// Until completion of the returned operation:
            ///
            /// * Cancelling the operation sets its metadata's cancel_time, and begins restoring resources to their pre-
            /// request values. The operation is guaranteed to succeed at undoing all resource changes, after which
            /// point it terminates with a `CANCELLED` status. * All other attempts to modify the instance are rejected.
            /// * Reading the instance via the API continues to give the pre-request resource levels.
            ///
            /// Upon completion of the returned operation:
            ///
            /// * Billing begins for all successfully-allocated resources (some types may have lower than the requested
            /// levels). * All newly-reserved resources are available for serving the instance's tables. * The
            /// instance's new resource levels are readable via the API.
            ///
            /// The returned long-running operation will have a name of the format `/operations/` and can be used to
            /// track the instance modification.  The metadata field type is UpdateInstanceMetadata. The response field
            /// type is Instance, if successful.
            ///
            /// Authorization requires `spanner.instances.update` permission on resource name.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="name">Required. A unique identifier for the instance, which cannot be changed after the instance is
            /// created. Values are of the form `projects//instances/a-z*[a-z0-9]`. The final segment of the name must be between 6
            /// and 30 characters in length.</param>
            public virtual PatchRequest Patch(Google.Apis.Spanner.v1.Data.UpdateInstanceRequest body, string name)
            {
                return new PatchRequest(service, body, name);
            }

            /// <summary>Updates an instance, and begins allocating or releasing resources as requested. The returned
            /// long-running operation can be used to track the progress of updating the instance. If the named instance
            /// does not exist, returns `NOT_FOUND`.
            ///
            /// Immediately upon completion of this request:
            ///
            /// * For resource types for which a decrease in the instance's allocation has been requested, billing is
            /// based on the newly-requested level.
            ///
            /// Until completion of the returned operation:
            ///
            /// * Cancelling the operation sets its metadata's cancel_time, and begins restoring resources to their pre-
            /// request values. The operation is guaranteed to succeed at undoing all resource changes, after which
            /// point it terminates with a `CANCELLED` status. * All other attempts to modify the instance are rejected.
            /// * Reading the instance via the API continues to give the pre-request resource levels.
            ///
            /// Upon completion of the returned operation:
            ///
            /// * Billing begins for all successfully-allocated resources (some types may have lower than the requested
            /// levels). * All newly-reserved resources are available for serving the instance's tables. * The
            /// instance's new resource levels are readable via the API.
            ///
            /// The returned long-running operation will have a name of the format `/operations/` and can be used to
            /// track the instance modification.  The metadata field type is UpdateInstanceMetadata. The response field
            /// type is Instance, if successful.
            ///
            /// Authorization requires `spanner.instances.update` permission on resource name.</summary>
            public class PatchRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Operation>
            {
                /// <summary>Constructs a new Patch request.</summary>
                public PatchRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.UpdateInstanceRequest body, string name)
                    : base(service)
                {
                    Name = name;
                    Body = body;
                    InitParameters();
                }


                /// <summary>Required. A unique identifier for the instance, which cannot be changed after the instance
                /// is created. Values are of the form `projects//instances/a-z*[a-z0-9]`. The final segment of the name
                /// must be between 6 and 30 characters in length.</summary>
                [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Name { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Spanner.v1.Data.UpdateInstanceRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "patch"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "PATCH"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+name}"; }
                }

                /// <summary>Initializes Patch parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "name", new Google.Apis.Discovery.Parameter
                        {
                            Name = "name",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instances/[^/]+$",
                        });
                }

            }

            /// <summary>Sets the access control policy on an instance resource. Replaces any existing policy.
            ///
            /// Authorization requires `spanner.instances.setIamPolicy` on resource.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="resource">REQUIRED: The Cloud Spanner resource for which the policy is being set. The format is
            /// `projects//instances/` for instance resources and `projects//instances//databases/` for databases
            /// resources.</param>
            public virtual SetIamPolicyRequest SetIamPolicy(Google.Apis.Spanner.v1.Data.SetIamPolicyRequest body, string resource)
            {
                return new SetIamPolicyRequest(service, body, resource);
            }

            /// <summary>Sets the access control policy on an instance resource. Replaces any existing policy.
            ///
            /// Authorization requires `spanner.instances.setIamPolicy` on resource.</summary>
            public class SetIamPolicyRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.Policy>
            {
                /// <summary>Constructs a new SetIamPolicy request.</summary>
                public SetIamPolicyRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.SetIamPolicyRequest body, string resource)
                    : base(service)
                {
                    Resource = resource;
                    Body = body;
                    InitParameters();
                }


                /// <summary>REQUIRED: The Cloud Spanner resource for which the policy is being set. The format is
                /// `projects//instances/` for instance resources and `projects//instances//databases/` for databases
                /// resources.</summary>
                [Google.Apis.Util.RequestParameterAttribute("resource", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Resource { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Spanner.v1.Data.SetIamPolicyRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "setIamPolicy"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+resource}:setIamPolicy"; }
                }

                /// <summary>Initializes SetIamPolicy parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "resource", new Google.Apis.Discovery.Parameter
                        {
                            Name = "resource",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instances/[^/]+$",
                        });
                }

            }

            /// <summary>Returns permissions that the caller has on the specified instance resource.
            ///
            /// Attempting this RPC on a non-existent Cloud Spanner instance resource will result in a NOT_FOUND error
            /// if the user has `spanner.instances.list` permission on the containing Google Cloud Project. Otherwise
            /// returns an empty set of permissions.</summary>
            /// <param name="body">The body of the request.</param>
            /// <param name="resource">REQUIRED: The Cloud Spanner resource for which permissions are being tested. The format is
            /// `projects//instances/` for instance resources and `projects//instances//databases/` for database
            /// resources.</param>
            public virtual TestIamPermissionsRequest TestIamPermissions(Google.Apis.Spanner.v1.Data.TestIamPermissionsRequest body, string resource)
            {
                return new TestIamPermissionsRequest(service, body, resource);
            }

            /// <summary>Returns permissions that the caller has on the specified instance resource.
            ///
            /// Attempting this RPC on a non-existent Cloud Spanner instance resource will result in a NOT_FOUND error
            /// if the user has `spanner.instances.list` permission on the containing Google Cloud Project. Otherwise
            /// returns an empty set of permissions.</summary>
            public class TestIamPermissionsRequest : SpannerBaseServiceRequest<Google.Apis.Spanner.v1.Data.TestIamPermissionsResponse>
            {
                /// <summary>Constructs a new TestIamPermissions request.</summary>
                public TestIamPermissionsRequest(Google.Apis.Services.IClientService service, Google.Apis.Spanner.v1.Data.TestIamPermissionsRequest body, string resource)
                    : base(service)
                {
                    Resource = resource;
                    Body = body;
                    InitParameters();
                }


                /// <summary>REQUIRED: The Cloud Spanner resource for which permissions are being tested. The format is
                /// `projects//instances/` for instance resources and `projects//instances//databases/` for database
                /// resources.</summary>
                [Google.Apis.Util.RequestParameterAttribute("resource", Google.Apis.Util.RequestParameterType.Path)]
                public virtual string Resource { get; private set; }


                /// <summary>Gets or sets the body of this request.</summary>
                Google.Apis.Spanner.v1.Data.TestIamPermissionsRequest Body { get; set; }

                ///<summary>Returns the body of the request.</summary>
                protected override object GetBody() { return Body; }

                ///<summary>Gets the method name.</summary>
                public override string MethodName
                {
                    get { return "testIamPermissions"; }
                }

                ///<summary>Gets the HTTP method.</summary>
                public override string HttpMethod
                {
                    get { return "POST"; }
                }

                ///<summary>Gets the REST path.</summary>
                public override string RestPath
                {
                    get { return "v1/{+resource}:testIamPermissions"; }
                }

                /// <summary>Initializes TestIamPermissions parameter list.</summary>
                protected override void InitParameters()
                {
                    base.InitParameters();

                    RequestParameters.Add(
                        "resource", new Google.Apis.Discovery.Parameter
                        {
                            Name = "resource",
                            IsRequired = true,
                            ParameterType = "path",
                            DefaultValue = null,
                            Pattern = @"^projects/[^/]+/instances/[^/]+$",
                        });
                }

            }
        }
    }
}

namespace Google.Apis.Spanner.v1.Data
{    

    /// <summary>Specifies the audit configuration for a service. It consists of which permission types are logged, and
    /// what identities, if any, are exempted from logging. An AuditConifg must have one or more
    /// AuditLogConfigs.</summary>
    public class AuditConfig : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The configuration for logging of each type of permission. Next ID: 4</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("auditLogConfigs")]
        public virtual System.Collections.Generic.IList<AuditLogConfig> AuditLogConfigs { get; set; } 

        /// <summary>Specifies the identities that are exempted from "data access" audit logging for the `service`
        /// specified above. Follows the same format of Binding.members. This field is deprecated in favor of per-
        /// permission-type exemptions.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("exemptedMembers")]
        public virtual System.Collections.Generic.IList<string> ExemptedMembers { get; set; } 

        /// <summary>Specifies a service that will be enabled for audit logging. For example, `resourcemanager`,
        /// `storage`, `compute`. `allServices` is a special value that covers all services.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("service")]
        public virtual string Service { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Provides the configuration for logging a type of permissions. Example:
    ///
    /// { "audit_log_configs": [ { "log_type": "DATA_READ", "exempted_members": [ "user:foo@gmail.com" ] }, {
    /// "log_type": "DATA_WRITE", } ] }
    ///
    /// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting foo@gmail.com from DATA_READ
    /// logging.</summary>
    public class AuditLogConfig : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Specifies the identities that do not cause logging for this type of permission. Follows the same
        /// format of Binding.members.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("exemptedMembers")]
        public virtual System.Collections.Generic.IList<string> ExemptedMembers { get; set; } 

        /// <summary>The log type that this config enables.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("logType")]
        public virtual string LogType { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for BeginTransaction.</summary>
    public class BeginTransactionRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. Options for the new transaction.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("options")]
        public virtual TransactionOptions Options { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Associates `members` with a `role`.</summary>
    public class Binding : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Specifies the identities requesting access for a Cloud Platform resource. `members` can have the
        /// following values:
        ///
        /// * `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google
        /// account.
        ///
        /// * `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google
        /// account or a service account.
        ///
        /// * `user:{emailid}`: An email address that represents a specific Google account. For example,
        /// `alice@gmail.com` or `joe@example.com`.
        ///
        /// * `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-
        /// app@appspot.gserviceaccount.com`.
        ///
        /// * `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.
        ///
        /// * `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example,
        /// `google.com` or `example.com`.
        ///
        /// </summary>
        [Newtonsoft.Json.JsonPropertyAttribute("members")]
        public virtual System.Collections.Generic.IList<string> Members { get; set; } 

        /// <summary>Role that is assigned to `members`. For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        /// Required</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("role")]
        public virtual string Role { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Metadata associated with a parent-child relationship appearing in a PlanNode.</summary>
    public class ChildLink : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The node to which the link points.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("childIndex")]
        public virtual System.Nullable<int> ChildIndex { get; set; } 

        /// <summary>The type of the link. For example, in Hash Joins this could be used to distinguish between the
        /// build child and the probe child, or in the case of the child being an output variable, to represent the tag
        /// associated with the output variable.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>Only present if the child node is SCALAR and corresponds to an output variable of the parent node.
        /// The field carries the name of the output variable. For example, a `TableScan` operator that reads rows from
        /// a table will have child links to the `SCALAR` nodes representing the output variables created for each
        /// column that is read by the operator. The corresponding `variable` fields will be set to the variable names
        /// assigned to the columns.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("variable")]
        public virtual string Variable { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Write a Cloud Audit log</summary>
    public class CloudAuditOptions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for Commit.</summary>
    public class CommitRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The mutations to be executed when this transaction commits. All mutations are applied atomically,
        /// in the order they appear in this list.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mutations")]
        public virtual System.Collections.Generic.IList<Mutation> Mutations { get; set; } 

        /// <summary>Execute mutations in a temporary transaction. Note that unlike commit of a previously-started
        /// transaction, commit with a temporary transaction is non-idempotent. That is, if the `CommitRequest` is sent
        /// to Cloud Spanner more than once (for instance, due to retries in the application, or in the transport
        /// library), it is possible that the mutations are executed more than once. If this is undesirable, use
        /// BeginTransaction and Commit instead.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("singleUseTransaction")]
        public virtual TransactionOptions SingleUseTransaction { get; set; } 

        /// <summary>Commit a previously-started transaction.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transactionId")]
        public virtual string TransactionId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response for Commit.</summary>
    public class CommitResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The Cloud Spanner timestamp at which the transaction committed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("commitTimestamp")]
        public virtual object CommitTimestamp { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A condition to be met.</summary>
    public class Condition : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Trusted attributes supplied by the IAM system.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("iam")]
        public virtual string Iam { get; set; } 

        /// <summary>An operator to apply the subject with.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("op")]
        public virtual string Op { get; set; } 

        /// <summary>Trusted attributes discharged by the service.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("svc")]
        public virtual string Svc { get; set; } 

        /// <summary>Trusted attributes supplied by any service that owns resources and uses the IAM system for access
        /// control.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("sys")]
        public virtual string Sys { get; set; } 

        /// <summary>DEPRECATED. Use 'values' instead.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual string Value { get; set; } 

        /// <summary>The objects of the condition. This is mutually exclusive with 'value'.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("values")]
        public virtual System.Collections.Generic.IList<string> Values { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Options for counters</summary>
    public class CounterOptions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The field value to attribute.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("field")]
        public virtual string Field { get; set; } 

        /// <summary>The metric to update.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metric")]
        public virtual string Metric { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Metadata type for the operation returned by CreateDatabase.</summary>
    public class CreateDatabaseMetadata : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The database being created.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("database")]
        public virtual string Database { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for CreateDatabase.</summary>
    public class CreateDatabaseRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. A `CREATE DATABASE` statement, which specifies the ID of the new database.  The database
        /// ID must conform to the regular expression `a-z*[a-z0-9]` and be between 2 and 30 characters in
        /// length.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("createStatement")]
        public virtual string CreateStatement { get; set; } 

        /// <summary>An optional list of DDL statements to run inside the newly created database. Statements can create
        /// tables, indexes, etc. These statements execute atomically with the creation of the database: if there is an
        /// error in any statement, the database is not created.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("extraStatements")]
        public virtual System.Collections.Generic.IList<string> ExtraStatements { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Metadata type for the operation returned by CreateInstance.</summary>
    public class CreateInstanceMetadata : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The time at which this operation was cancelled. If set, this operation is in the process of undoing
        /// itself (which is guaranteed to succeed) and cannot be cancelled again.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cancelTime")]
        public virtual object CancelTime { get; set; } 

        /// <summary>The time at which this operation failed or was completed successfully.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endTime")]
        public virtual object EndTime { get; set; } 

        /// <summary>The instance being created.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instance")]
        public virtual Instance Instance { get; set; } 

        /// <summary>The time at which the CreateInstance request was received.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startTime")]
        public virtual object StartTime { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for CreateInstance.</summary>
    public class CreateInstanceRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The instance to create.  The name may be omitted, but if specified must be
        /// `/instances/`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instance")]
        public virtual Instance Instance { get; set; } 

        /// <summary>Required. The ID of the instance to create.  Valid identifiers are of the form `a-z*[a-z0-9]` and
        /// must be between 6 and 30 characters in length.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instanceId")]
        public virtual string InstanceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Write a Data Access (Gin) log</summary>
    public class DataAccessOptions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A Cloud Spanner database.</summary>
    public class Database : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The name of the database. Values are of the form `projects//instances//databases/`, where
        /// `` is as specified in the `CREATE DATABASE` statement. This name can be passed to other API methods to
        /// identify the database.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>Output only. The current database state.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("state")]
        public virtual string State { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Arguments to delete operations.</summary>
    public class Delete : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The primary keys of the rows within table to delete.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("keySet")]
        public virtual KeySet KeySet { get; set; } 

        /// <summary>Required. The table whose rows will be deleted.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("table")]
        public virtual string Table { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A
    /// typical example is to use it as the request or the response type of an API method. For instance:
    ///
    /// service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); }
    ///
    /// The JSON representation for `Empty` is empty JSON object `{}`.</summary>
    public class Empty : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for ExecuteSql and ExecuteStreamingSql.</summary>
    public class ExecuteSqlRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>It is not always possible for Cloud Spanner to infer the right SQL type from a JSON value.  For
        /// example, values of type `BYTES` and values of type `STRING` both appear in params as JSON strings.
        ///
        /// In these cases, `param_types` can be used to specify the exact SQL type for some or all of the SQL query
        /// parameters. See the definition of Type for more information about SQL types.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("paramTypes")]
        public virtual System.Collections.Generic.IDictionary<string,Type> ParamTypes { get; set; } 

        /// <summary>The SQL query string can contain parameter placeholders. A parameter placeholder consists of `'@'`
        /// followed by the parameter name. Parameter names consist of any combination of letters, numbers, and
        /// underscores.
        ///
        /// Parameters can appear anywhere that a literal value is expected.  The same parameter name can be used more
        /// than once, for example: `"WHERE id > @msg_id AND id < @msg_id + 100"`
        ///
        /// It is an error to execute an SQL query with unbound parameters.
        ///
        /// Parameter values are specified using `params`, which is a JSON object whose keys are parameter names, and
        /// whose values are the corresponding parameter values.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("params")]
        public virtual System.Collections.Generic.IDictionary<string,object> Params__ { get; set; } 

        /// <summary>Used to control the amount of debugging information returned in ResultSetStats.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("queryMode")]
        public virtual string QueryMode { get; set; } 

        /// <summary>If this request is resuming a previously interrupted SQL query execution, `resume_token` should be
        /// copied from the last PartialResultSet yielded before the interruption. Doing this enables the new SQL query
        /// execution to resume where the last one left off. The rest of the request parameters must exactly match the
        /// request that yielded this token.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resumeToken")]
        public virtual string ResumeToken { get; set; } 

        /// <summary>Required. The SQL query string.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("sql")]
        public virtual string Sql { get; set; } 

        /// <summary>The transaction to use. If none is provided, the default is a temporary read-only transaction with
        /// strong concurrency.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transaction")]
        public virtual TransactionSelector Transaction { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Message representing a single field of a struct.</summary>
    public class Field : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The name of the field. For reads, this is the column name. For SQL queries, it is the column alias
        /// (e.g., `"Word"` in the query `"SELECT 'hello' AS Word"`), or the column name (e.g., `"ColName"` in the query
        /// `"SELECT ColName FROM Table"`). Some columns might have an empty name (e.g., !"SELECT UPPER(ColName)"`).
        /// Note that a query result can contain multiple fields with the same name.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The type of the field.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual Type Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response for GetDatabaseDdl.</summary>
    public class GetDatabaseDdlResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of formatted DDL statements defining the schema of the database specified in the
        /// request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("statements")]
        public virtual System.Collections.Generic.IList<string> Statements { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Request message for `GetIamPolicy` method.</summary>
    public class GetIamPolicyRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An isolated set of Cloud Spanner resources on which databases can be hosted.</summary>
    public class Instance : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The name of the instance's configuration. Values are of the form
        /// `projects//instanceConfigs/`. See also InstanceConfig and ListInstanceConfigs.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("config")]
        public virtual string Config { get; set; } 

        /// <summary>Required. The descriptive name for this instance as it appears in UIs. Must be unique per project
        /// and between 4 and 30 characters in length.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("displayName")]
        public virtual string DisplayName { get; set; } 

        /// <summary>Cloud Labels are a flexible and lightweight mechanism for organizing cloud resources into groups
        /// that reflect a customer's organizational needs and deployment strategies. Cloud Labels can be used to filter
        /// collections of resources. They can be used to control how resource metrics are aggregated. And they can be
        /// used as arguments to policy management rules (e.g. route, firewall, load balancing, etc.).
        ///
        /// * Label keys must be between 1 and 63 characters long and must conform to the following regular expression:
        /// `[a-z]([-a-z0-9]*[a-z0-9])?`. * Label values must be between 0 and 63 characters long and must conform to
        /// the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`. * No more than 64 labels can be associated with a
        /// given resource.
        ///
        /// See https://goo.gl/xmQnxf for more information on and examples of labels.
        ///
        /// If you plan to use labels in your own code, please note that additional characters may be allowed in the
        /// future. And so you are advised to use an internal label representation, such as JSON, which doesn't rely
        /// upon specific characters being disallowed.  For example, representing labels as the string:  name + "_" +
        /// value  would prove problematic if we were to allow "_" in a future release.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("labels")]
        public virtual System.Collections.Generic.IDictionary<string,string> Labels { get; set; } 

        /// <summary>Required. A unique identifier for the instance, which cannot be changed after the instance is
        /// created. Values are of the form `projects//instances/a-z*[a-z0-9]`. The final segment of the name must be
        /// between 6 and 30 characters in length.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>Required. The number of nodes allocated to this instance.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nodeCount")]
        public virtual System.Nullable<int> NodeCount { get; set; } 

        /// <summary>Output only. The current instance state. For CreateInstance, the state must be either omitted or
        /// set to `CREATING`. For UpdateInstance, the state must be either omitted or set to `READY`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("state")]
        public virtual string State { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A possible configuration for a Cloud Spanner instance. Configurations define the geographic placement
    /// of nodes and their replication.</summary>
    public class InstanceConfig : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The name of this instance configuration as it appears in UIs.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("displayName")]
        public virtual string DisplayName { get; set; } 

        /// <summary>A unique identifier for the instance configuration.  Values are of the form
        /// `projects//instanceConfigs/a-z*`</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>KeyRange represents a range of rows in a table or index.
    ///
    /// A range has a start key and an end key. These keys can be open or closed, indicating if the range includes rows
    /// with that key.
    ///
    /// Keys are represented by lists, where the ith value in the list corresponds to the ith component of the table or
    /// index primary key. Individual values are encoded as described here.
    ///
    /// For example, consider the following table definition:
    ///
    /// CREATE TABLE UserEvents ( UserName STRING(MAX), EventDate STRING(10) ) PRIMARY KEY(UserName, EventDate);
    ///
    /// The following keys name rows in this table:
    ///
    /// "Bob", "2014-09-23"
    ///
    /// Since the `UserEvents` table's `PRIMARY KEY` clause names two columns, each `UserEvents` key has two elements;
    /// the first is the `UserName`, and the second is the `EventDate`.
    ///
    /// Key ranges with multiple components are interpreted lexicographically by component using the table or index
    /// key's declared sort order. For example, the following range returns all events for user `"Bob"` that occurred in
    /// the year 2015:
    ///
    /// "start_closed": ["Bob", "2015-01-01"] "end_closed": ["Bob", "2015-12-31"]
    ///
    /// Start and end keys can omit trailing key components. This affects the inclusion and exclusion of rows that
    /// exactly match the provided key components: if the key is closed, then rows that exactly match the provided
    /// components are included; if the key is open, then rows that exactly match are not included.
    ///
    /// For example, the following range includes all events for `"Bob"` that occurred during and after the year 2000:
    ///
    /// "start_closed": ["Bob", "2000-01-01"] "end_closed": ["Bob"]
    ///
    /// The next example retrieves all events for `"Bob"`:
    ///
    /// "start_closed": ["Bob"] "end_closed": ["Bob"]
    ///
    /// To retrieve events before the year 2000:
    ///
    /// "start_closed": ["Bob"] "end_open": ["Bob", "2000-01-01"]
    ///
    /// The following range includes all rows in the table:
    ///
    /// "start_closed": [] "end_closed": []
    ///
    /// This range returns all users whose `UserName` begins with any character from A to C:
    ///
    /// "start_closed": ["A"] "end_open": ["D"]
    ///
    /// This range returns all users whose `UserName` begins with B:
    ///
    /// "start_closed": ["B"] "end_open": ["C"]
    ///
    /// Key ranges honor column sort order. For example, suppose a table is defined as follows:
    ///
    /// CREATE TABLE DescendingSortedTable { Key INT64, ... ) PRIMARY KEY(Key DESC);
    ///
    /// The following range retrieves all rows with key values between 1 and 100 inclusive:
    ///
    /// "start_closed": ["100"] "end_closed": ["1"]
    ///
    /// Note that 100 is passed as the start, and 1 is passed as the end, because `Key` is a descending column in the
    /// schema.</summary>
    public class KeyRange : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If the end is closed, then the range includes all rows whose first `len(end_closed)` key columns
        /// exactly match `end_closed`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endClosed")]
        public virtual System.Collections.Generic.IList<object> EndClosed { get; set; } 

        /// <summary>If the end is open, then the range excludes rows whose first `len(end_open)` key columns exactly
        /// match `end_open`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endOpen")]
        public virtual System.Collections.Generic.IList<object> EndOpen { get; set; } 

        /// <summary>If the start is closed, then the range includes all rows whose first `len(start_closed)` key
        /// columns exactly match `start_closed`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startClosed")]
        public virtual System.Collections.Generic.IList<object> StartClosed { get; set; } 

        /// <summary>If the start is open, then the range excludes rows whose first `len(start_open)` key columns
        /// exactly match `start_open`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startOpen")]
        public virtual System.Collections.Generic.IList<object> StartOpen { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>`KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All the keys are expected to be
    /// in the same table or index. The keys need not be sorted in any particular way.
    ///
    /// If the same key is specified multiple times in the set (for example if two ranges, two keys, or a key and a
    /// range overlap), Cloud Spanner behaves as if the key were only specified once.</summary>
    public class KeySet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>For convenience `all` can be set to `true` to indicate that this `KeySet` matches all keys in the
        /// table or index. Note that any keys specified in `keys` or `ranges` are only yielded once.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("all")]
        public virtual System.Nullable<bool> All { get; set; } 

        /// <summary>A list of specific keys. Entries in `keys` should have exactly as many elements as there are
        /// columns in the primary or index key with which this `KeySet` is used.  Individual key values are encoded as
        /// described here.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("keys")]
        public virtual System.Collections.Generic.IList<System.Collections.Generic.IList<object>> Keys { get; set; } 

        /// <summary>A list of key ranges. See KeyRange for more information about key range specifications.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ranges")]
        public virtual System.Collections.Generic.IList<KeyRange> Ranges { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response for ListDatabases.</summary>
    public class ListDatabasesResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Databases that matched the request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("databases")]
        public virtual System.Collections.Generic.IList<Database> Databases { get; set; } 

        /// <summary>`next_page_token` can be sent in a subsequent ListDatabases call to fetch more of the matching
        /// databases.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response for ListInstanceConfigs.</summary>
    public class ListInstanceConfigsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The list of requested instance configurations.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instanceConfigs")]
        public virtual System.Collections.Generic.IList<InstanceConfig> InstanceConfigs { get; set; } 

        /// <summary>`next_page_token` can be sent in a subsequent ListInstanceConfigs call to fetch more of the
        /// matching instance configurations.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response for ListInstances.</summary>
    public class ListInstancesResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The list of requested instances.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instances")]
        public virtual System.Collections.Generic.IList<Instance> Instances { get; set; } 

        /// <summary>`next_page_token` can be sent in a subsequent ListInstances call to fetch more of the matching
        /// instances.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response message for Operations.ListOperations.</summary>
    public class ListOperationsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The standard List next-page token.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>A list of operations that matches the specified filter in the request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("operations")]
        public virtual System.Collections.Generic.IList<Operation> Operations { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Specifies what kind of log the caller must write Increment a streamz counter with the specified metric
    /// and field names.
    ///
    /// Metric names should start with a '/', generally be lowercase-only, and end in "_count". Field names should not
    /// contain an initial slash. The actual exported metric names will have "/iam/policy" prepended.
    ///
    /// Field names correspond to IAM request parameters and field values are their respective values.
    ///
    /// At present the only supported field names are - "iam_principal", corresponding to IAMContext.principal; - ""
    /// (empty string), resulting in one aggretated counter with no field.
    ///
    /// Examples: counter { metric: "/debug_access_count"  field: "iam_principal" } ==> increment counter
    /// /iam/policy/backend_debug_access_count {iam_principal=[value of IAMContext.principal]}
    ///
    /// At this time we do not support: * multiple field names (though this may be supported in the future) *
    /// decrementing the counter * incrementing it by anything other than 1</summary>
    public class LogConfig : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Cloud audit options.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cloudAudit")]
        public virtual CloudAuditOptions CloudAudit { get; set; } 

        /// <summary>Counter options.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("counter")]
        public virtual CounterOptions Counter { get; set; } 

        /// <summary>Data access options.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("dataAccess")]
        public virtual DataAccessOptions DataAccess { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A modification to one or more Cloud Spanner rows.  Mutations can be applied to a Cloud Spanner database
    /// by sending them in a Commit call.</summary>
    public class Mutation : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Delete rows from a table. Succeeds whether or not the named rows were present.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("delete")]
        public virtual Delete Delete { get; set; } 

        /// <summary>Insert new rows in a table. If any of the rows already exist, the write or transaction fails with
        /// error `ALREADY_EXISTS`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("insert")]
        public virtual Write Insert { get; set; } 

        /// <summary>Like insert, except that if the row already exists, then its column values are overwritten with the
        /// ones provided. Any column values not explicitly written are preserved.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("insertOrUpdate")]
        public virtual Write InsertOrUpdate { get; set; } 

        /// <summary>Like insert, except that if the row already exists, it is deleted, and the column values provided
        /// are inserted instead. Unlike insert_or_update, this means any values not explicitly written become
        /// `NULL`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("replace")]
        public virtual Write Replace { get; set; } 

        /// <summary>Update existing rows in a table. If any of the rows does not already exist, the transaction fails
        /// with error `NOT_FOUND`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("update")]
        public virtual Write Update { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>This resource represents a long-running operation that is the result of a network API call.</summary>
    public class Operation : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If the value is `false`, it means the operation is still in progress. If true, the operation is
        /// completed, and either `error` or `response` is available.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("done")]
        public virtual System.Nullable<bool> Done { get; set; } 

        /// <summary>The error result of the operation in case of failure or cancellation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("error")]
        public virtual Status Error { get; set; } 

        /// <summary>Service-specific metadata associated with the operation.  It typically contains progress
        /// information and common metadata such as create time. Some services might not provide such metadata.  Any
        /// method that returns a long-running operation should document the metadata type, if any.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metadata")]
        public virtual System.Collections.Generic.IDictionary<string,object> Metadata { get; set; } 

        /// <summary>The server-assigned name, which is only unique within the same service that originally returns it.
        /// If you use the default HTTP mapping, the `name` should have the format of
        /// `operations/some/unique/name`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The normal response of the operation in case of success.  If the original method returns no data on
        /// success, such as `Delete`, the response is `google.protobuf.Empty`.  If the original method is standard
        /// `Get`/`Create`/`Update`, the response should be the resource.  For other methods, the response should have
        /// the type `XxxResponse`, where `Xxx` is the original method name.  For example, if the original method name
        /// is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("response")]
        public virtual System.Collections.Generic.IDictionary<string,object> Response { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Partial results from a streaming read or SQL query. Streaming reads and SQL queries better tolerate
    /// large result sets, large rows, and large values, but are a little trickier to consume.</summary>
    public class PartialResultSet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If true, then the final value in values is chunked, and must be combined with more values from
        /// subsequent `PartialResultSet`s to obtain a complete field value.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("chunkedValue")]
        public virtual System.Nullable<bool> ChunkedValue { get; set; } 

        /// <summary>Metadata about the result set, such as row type information. Only present in the first
        /// response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metadata")]
        public virtual ResultSetMetadata Metadata { get; set; } 

        /// <summary>Streaming calls might be interrupted for a variety of reasons, such as TCP connection loss. If this
        /// occurs, the stream of results can be resumed by re-sending the original request and including
        /// `resume_token`. Note that executing any other transaction in the same session invalidates the
        /// token.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resumeToken")]
        public virtual string ResumeToken { get; set; } 

        /// <summary>Query plan and execution statistics for the query that produced this streaming result set. These
        /// can be requested by setting ExecuteSqlRequest.query_mode and are sent only once with the last response in
        /// the stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("stats")]
        public virtual ResultSetStats Stats { get; set; } 

        /// <summary>A streamed result set consists of a stream of values, which might be split into many
        /// `PartialResultSet` messages to accommodate large rows and/or large values. Every N complete values defines a
        /// row, where N is equal to the number of entries in metadata.row_type.fields.
        ///
        /// Most values are encoded based on type as described here.
        ///
        /// It is possible that the last value in values is "chunked", meaning that the rest of the value is sent in
        /// subsequent `PartialResultSet`(s). This is denoted by the chunked_value field. Two or more chunked values can
        /// be merged to form a complete value as follows:
        ///
        /// * `bool/number/null`: cannot be chunked * `string`: concatenate the strings * `list`: concatenate the lists.
        /// If the last element in a list is a `string`, `list`, or `object`, merge it with the first element in the
        /// next list by applying these rules recursively. * `object`: concatenate the (field name, field value) pairs.
        /// If a field name is duplicated, then apply these rules recursively to merge the field values.
        ///
        /// Some examples of merging:
        ///
        /// # Strings are concatenated. "foo", "bar" => "foobar"
        ///
        /// # Lists of non-strings are concatenated. [2, 3], [4] => [2, 3, 4]
        ///
        /// # Lists are concatenated, but the last and first elements are merged # because they are strings. ["a", "b"],
        /// ["c", "d"] => ["a", "bc", "d"]
        ///
        /// # Lists are concatenated, but the last and first elements are merged # because they are lists. Recursively,
        /// the last and first elements # of the inner lists are merged because they are strings. ["a", ["b", "c"]],
        /// [["d"], "e"] => ["a", ["b", "cd"], "e"]
        ///
        /// # Non-overlapping object fields are combined. {"a": "1"}, {"b": "2"} => {"a": "1", "b": 2"}
        ///
        /// # Overlapping object fields are merged. {"a": "1"}, {"a": "2"} => {"a": "12"}
        ///
        /// # Examples of merging objects containing lists of strings. {"a": ["1"]}, {"a": ["2"]} => {"a": ["12"]}
        ///
        /// For a more complete example, suppose a streaming SQL query is yielding a result set whose rows contain a
        /// single string field. The following `PartialResultSet`s might be yielded:
        ///
        /// { "metadata": { ... } "values": ["Hello", "W"] "chunked_value": true "resume_token": "Af65..." } { "values":
        /// ["orl"] "chunked_value": true "resume_token": "Bqp2..." } { "values": ["d"] "resume_token": "Zx1B..." }
        ///
        /// This sequence of `PartialResultSet`s encodes two rows, one containing the field value `"Hello"`, and a
        /// second containing the field value `"World" = "W" + "orl" + "d"`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("values")]
        public virtual System.Collections.Generic.IList<object> Values { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Node information for nodes appearing in a QueryPlan.plan_nodes.</summary>
    public class PlanNode : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>List of child node `index`es and their relationship to this parent.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("childLinks")]
        public virtual System.Collections.Generic.IList<ChildLink> ChildLinks { get; set; } 

        /// <summary>The display name for the node.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("displayName")]
        public virtual string DisplayName { get; set; } 

        /// <summary>The execution statistics associated with the node, contained in a group of key-value pairs. Only
        /// present if the plan was returned as a result of a profile query. For example, number of executions, number
        /// of rows/time per execution etc.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("executionStats")]
        public virtual System.Collections.Generic.IDictionary<string,object> ExecutionStats { get; set; } 

        /// <summary>The `PlanNode`'s index in node list.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("index")]
        public virtual System.Nullable<int> Index { get; set; } 

        /// <summary>Used to determine the type of node. May be needed for visualizing different kinds of nodes
        /// differently. For example, If the node is a SCALAR node, it will have a condensed representation which can be
        /// used to directly embed a description of the node in its parent.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>Attributes relevant to the node contained in a group of key-value pairs. For example, a Parameter
        /// Reference node could have the following information in its metadata:
        ///
        /// { "parameter_reference": "param1", "parameter_type": "array" }</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metadata")]
        public virtual System.Collections.Generic.IDictionary<string,object> Metadata { get; set; } 

        /// <summary>Condensed representation for SCALAR nodes.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("shortRepresentation")]
        public virtual ShortRepresentation ShortRepresentation { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies
    /// for Cloud Platform resources.
    ///
    /// A `Policy` consists of a list of `bindings`. A `Binding` binds a list of `members` to a `role`, where the
    /// members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of
    /// permissions defined by IAM.
    ///
    /// **Example**
    ///
    /// { "bindings": [ { "role": "roles/owner", "members": [ "user:mike@example.com", "group:admins@example.com",
    /// "domain:google.com", "serviceAccount:my-other-app@appspot.gserviceaccount.com", ] }, { "role": "roles/viewer",
    /// "members": ["user:sean@example.com"] } ] }
    ///
    /// For a description of IAM and its features, see the [IAM developer's
    /// guide](https://cloud.google.com/iam).</summary>
    public class Policy : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Specifies cloud audit logging configuration for this policy.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("auditConfigs")]
        public virtual System.Collections.Generic.IList<AuditConfig> AuditConfigs { get; set; } 

        /// <summary>Associates a list of `members` to a `role`. Multiple `bindings` must not be specified for the same
        /// `role`. `bindings` with no members will result in an error.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bindings")]
        public virtual System.Collections.Generic.IList<Binding> Bindings { get; set; } 

        /// <summary>`etag` is used for optimistic concurrency control as a way to help prevent simultaneous updates of
        /// a policy from overwriting each other. It is strongly suggested that systems make use of the `etag` in the
        /// read-modify-write cycle to perform policy updates in order to avoid race conditions: An `etag` is returned
        /// in the response to `getIamPolicy`, and systems are expected to put that etag in the request to
        /// `setIamPolicy` to ensure that their change will be applied to the same version of the policy.
        ///
        /// If no `etag` is provided in the call to `setIamPolicy`, then the existing policy is overwritten
        /// blindly.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("iamOwned")]
        public virtual System.Nullable<bool> IamOwned { get; set; } 

        /// <summary>If more than one rule is specified, the rules are applied in the following manner: - All matching
        /// LOG rules are always applied. - If any DENY/DENY_WITH_LOG rule matches, permission is denied. Logging will
        /// be applied if one or more matching rule requires logging. - Otherwise, if any ALLOW/ALLOW_WITH_LOG rule
        /// matches, permission is granted. Logging will be applied if one or more matching rule requires logging. -
        /// Otherwise, if no rule applies, permission is denied.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rules")]
        public virtual System.Collections.Generic.IList<Rule> Rules { get; set; } 

        /// <summary>Version of the `Policy`. The default version is 0.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("version")]
        public virtual System.Nullable<int> Version { get; set; } 

    }    

    /// <summary>Contains an ordered list of nodes appearing in the query plan.</summary>
    public class QueryPlan : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The nodes in the query plan. Plan nodes are returned in pre-order starting with the plan root. Each
        /// PlanNode's `id` corresponds to its index in `plan_nodes`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("planNodes")]
        public virtual System.Collections.Generic.IList<PlanNode> PlanNodes { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Options for read-only transactions.</summary>
    public class ReadOnly : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Executes all reads at a timestamp that is `exact_staleness` old. The timestamp is chosen soon after
        /// the read is started.
        ///
        /// Guarantees that all writes that have committed more than the specified number of seconds ago are visible.
        /// Because Cloud Spanner chooses the exact timestamp, this mode works even if the client's local clock is
        /// substantially skewed from Cloud Spanner commit timestamps.
        ///
        /// Useful for reading at nearby replicas without the distributed timestamp negotiation overhead of
        /// `max_staleness`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("exactStaleness")]
        public virtual object ExactStaleness { get; set; } 

        /// <summary>Read data at a timestamp >= `NOW - max_staleness` seconds. Guarantees that all writes that have
        /// committed more than the specified number of seconds ago are visible. Because Cloud Spanner chooses the exact
        /// timestamp, this mode works even if the client's local clock is substantially skewed from Cloud Spanner
        /// commit timestamps.
        ///
        /// Useful for reading the freshest data available at a nearby replica, while bounding the possible staleness if
        /// the local replica has fallen behind.
        ///
        /// Note that this option can only be used in single-use transactions.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("maxStaleness")]
        public virtual object MaxStaleness { get; set; } 

        /// <summary>Executes all reads at a timestamp >= `min_read_timestamp`.
        ///
        /// This is useful for requesting fresher data than some previous read, or data that is fresh enough to observe
        /// the effects of some previously committed transaction whose timestamp is known.
        ///
        /// Note that this option can only be used in single-use transactions.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("minReadTimestamp")]
        public virtual object MinReadTimestamp { get; set; } 

        /// <summary>Executes all reads at the given timestamp. Unlike other modes, reads at a specific timestamp are
        /// repeatable; the same read at the same timestamp always returns the same data. If the timestamp is in the
        /// future, the read will block until the specified timestamp, modulo the read's deadline.
        ///
        /// Useful for large scale consistent reads such as mapreduces, or for coordinating many reads against a
        /// consistent snapshot of the data.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("readTimestamp")]
        public virtual object ReadTimestamp { get; set; } 

        /// <summary>If true, the Cloud Spanner-selected read timestamp is included in the Transaction message that
        /// describes the transaction.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("returnReadTimestamp")]
        public virtual System.Nullable<bool> ReturnReadTimestamp { get; set; } 

        /// <summary>Read at a timestamp where all previously committed transactions are visible.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("strong")]
        public virtual System.Nullable<bool> Strong { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for Read and StreamingRead.</summary>
    public class ReadRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The columns of table to be returned for each row matching this request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("columns")]
        public virtual System.Collections.Generic.IList<string> Columns { get; set; } 

        /// <summary>If non-empty, the name of an index on table. This index is used instead of the table primary key
        /// when interpreting key_set and sorting result rows. See key_set for further information.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("index")]
        public virtual string Index { get; set; } 

        /// <summary>Required. `key_set` identifies the rows to be yielded. `key_set` names the primary keys of the rows
        /// in table to be yielded, unless index is present. If index is present, then key_set instead names index keys
        /// in index.
        ///
        /// Rows are yielded in table primary key order (if index is empty) or index key order (if index is non-empty).
        ///
        /// It is not an error for the `key_set` to name rows that do not exist in the database. Read yields nothing for
        /// nonexistent rows.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("keySet")]
        public virtual KeySet KeySet { get; set; } 

        /// <summary>If greater than zero, only the first `limit` rows are yielded. If `limit` is zero, the default is
        /// no limit.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("limit")]
        public virtual System.Nullable<long> Limit { get; set; } 

        /// <summary>If this request is resuming a previously interrupted read, `resume_token` should be copied from the
        /// last PartialResultSet yielded before the interruption. Doing this enables the new read to resume where the
        /// last read left off. The rest of the request parameters must exactly match the request that yielded this
        /// token.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resumeToken")]
        public virtual string ResumeToken { get; set; } 

        /// <summary>Required. The name of the table in the database to be read.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("table")]
        public virtual string Table { get; set; } 

        /// <summary>The transaction to use. If none is provided, the default is a temporary read-only transaction with
        /// strong concurrency.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transaction")]
        public virtual TransactionSelector Transaction { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Options for read-write transactions.</summary>
    public class ReadWrite : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Results from Read or ExecuteSql.</summary>
    public class ResultSet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Metadata about the result set, such as row type information.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metadata")]
        public virtual ResultSetMetadata Metadata { get; set; } 

        /// <summary>Each element in `rows` is a row whose format is defined by metadata.row_type. The ith element in
        /// each row matches the ith field in metadata.row_type. Elements are encoded based on type as described
        /// here.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rows")]
        public virtual System.Collections.Generic.IList<System.Collections.Generic.IList<object>> Rows { get; set; } 

        /// <summary>Query plan and execution statistics for the query that produced this result set. These can be
        /// requested by setting ExecuteSqlRequest.query_mode.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("stats")]
        public virtual ResultSetStats Stats { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Metadata about a ResultSet or PartialResultSet.</summary>
    public class ResultSetMetadata : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Indicates the field names and types for the rows in the result set.  For example, a SQL query like
        /// `"SELECT UserId, UserName FROM Users"` could return a `row_type` value like:
        ///
        /// "fields": [ { "name": "UserId", "type": { "code": "INT64" } }, { "name": "UserName", "type": { "code":
        /// "STRING" } }, ]</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rowType")]
        public virtual StructType RowType { get; set; } 

        /// <summary>If the read or SQL query began a transaction as a side-effect, the information about the new
        /// transaction is yielded here.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transaction")]
        public virtual Transaction Transaction { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Additional statistics about a ResultSet or PartialResultSet.</summary>
    public class ResultSetStats : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>QueryPlan for the query associated with this result.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("queryPlan")]
        public virtual QueryPlan QueryPlan { get; set; } 

        /// <summary>Aggregated statistics from the execution of the query. Only present when the query is profiled. For
        /// example, a query could return the statistics as follows:
        ///
        /// { "rows_returned": "3", "elapsed_time": "1.22 secs", "cpu_time": "1.19 secs" }</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("queryStats")]
        public virtual System.Collections.Generic.IDictionary<string,object> QueryStats { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for Rollback.</summary>
    public class RollbackRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The transaction to roll back.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transactionId")]
        public virtual string TransactionId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A rule to be applied in a Policy.</summary>
    public class Rule : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("action")]
        public virtual string Action { get; set; } 

        /// <summary>Additional restrictions that must be met</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("conditions")]
        public virtual System.Collections.Generic.IList<Condition> Conditions { get; set; } 

        /// <summary>Human-readable description of the rule.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>If one or more 'in' clauses are specified, the rule matches if the PRINCIPAL/AUTHORITY_SELECTOR is
        /// in at least one of these entries.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("in")]
        public virtual System.Collections.Generic.IList<string> In__ { get; set; } 

        /// <summary>The config returned to callers of tech.iam.IAM.CheckPolicy for any entries that match the LOG
        /// action.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("logConfig")]
        public virtual System.Collections.Generic.IList<LogConfig> LogConfig { get; set; } 

        /// <summary>If one or more 'not_in' clauses are specified, the rule matches if the PRINCIPAL/AUTHORITY_SELECTOR
        /// is in none of the entries. The format for in and not_in entries is the same as for members in a Binding (see
        /// google/iam/v1/policy.proto).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("notIn")]
        public virtual System.Collections.Generic.IList<string> NotIn { get; set; } 

        /// <summary>A permission is a string of form '..' (e.g., 'storage.buckets.list'). A value of '*' matches all
        /// permissions, and a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("permissions")]
        public virtual System.Collections.Generic.IList<string> Permissions { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A session in the Cloud Spanner API.</summary>
    public class Session : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. The name of the session.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Request message for `SetIamPolicy` method.</summary>
    public class SetIamPolicyRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>REQUIRED: The complete policy to be applied to the `resource`. The size of the policy is limited to
        /// a few 10s of KB. An empty policy is a valid policy but certain Cloud Platform services (such as Projects)
        /// might reject them.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("policy")]
        public virtual Policy Policy { get; set; } 

        /// <summary>OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only the fields in the mask
        /// will be modified. If no mask is provided, a default mask is used: paths: "bindings, etag" This field is only
        /// used by Cloud IAM.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("updateMask")]
        public virtual object UpdateMask { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Condensed representation of a node and its subtree. Only present for `SCALAR` PlanNode(s).</summary>
    public class ShortRepresentation : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A string representation of the expression subtree rooted at this node.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>A mapping of (subquery variable name) -> (subquery node id) for cases where the `description`
        /// string of this node references a `SCALAR` subquery contained in the expression subtree rooted at this node.
        /// The referenced `SCALAR` subquery may not necessarily be a direct child of this node.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("subqueries")]
        public virtual System.Collections.Generic.IDictionary<string,System.Nullable<int>> Subqueries { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The `Status` type defines a logical error model that is suitable for different programming
    /// environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). The error model
    /// is designed to be:
    ///
    /// - Simple to use and understand for most users - Flexible enough to meet unexpected needs
    ///
    /// # Overview
    ///
    /// The `Status` message contains three pieces of data: error code, error message, and error details. The error code
    /// should be an enum value of google.rpc.Code, but it may accept additional error codes if needed.  The error
    /// message should be a developer-facing English message that helps developers *understand* and *resolve* the error.
    /// If a localized user-facing error message is needed, put the localized message in the error details or localize
    /// it in the client. The optional error details may contain arbitrary information about the error. There is a
    /// predefined set of error detail types in the package `google.rpc` which can be used for common error conditions.
    ///
    /// # Language mapping
    ///
    /// The `Status` message is the logical representation of the error model, but it is not necessarily the actual wire
    /// format. When the `Status` message is exposed in different client libraries and different wire protocols, it can
    /// be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped
    /// to some error codes in C.
    ///
    /// # Other uses
    ///
    /// The error model and the `Status` message can be used in a variety of environments, either with or without APIs,
    /// to provide a consistent developer experience across different environments.
    ///
    /// Example uses of this error model include:
    ///
    /// - Partial errors. If a service needs to return partial errors to the client, it may embed the `Status` in the
    /// normal response to indicate the partial errors.
    ///
    /// - Workflow errors. A typical workflow has multiple steps. Each step may have a `Status` message for error
    /// reporting purpose.
    ///
    /// - Batch operations. If a client uses batch request and batch response, the `Status` message should be used
    /// directly inside batch response, one for each error sub-response.
    ///
    /// - Asynchronous operations. If an API call embeds asynchronous operation results in its response, the status of
    /// those operations should be represented directly using the `Status` message.
    ///
    /// - Logging. If some API errors are stored in logs, the message `Status` could be used directly after any
    /// stripping needed for security/privacy reasons.</summary>
    public class Status : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The status code, which should be an enum value of google.rpc.Code.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("code")]
        public virtual System.Nullable<int> Code { get; set; } 

        /// <summary>A list of messages that carry the error details.  There will be a common set of message types for
        /// APIs to use.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("details")]
        public virtual System.Collections.Generic.IList<System.Collections.Generic.IDictionary<string,object>> Details { get; set; } 

        /// <summary>A developer-facing error message, which should be in English. Any user-facing error message should
        /// be localized and sent in the google.rpc.Status.details field, or localized by the client.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("message")]
        public virtual string Message { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>`StructType` defines the fields of a STRUCT type.</summary>
    public class StructType : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The list of fields that make up this struct. Order is significant, because values of this struct
        /// type are represented as lists, where the order of field values matches the order of fields in the
        /// StructType. In turn, the order of fields matches the order of columns in a read request, or the order of
        /// fields in the `SELECT` clause of a query.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fields")]
        public virtual System.Collections.Generic.IList<Field> Fields { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Request message for `TestIamPermissions` method.</summary>
    public class TestIamPermissionsRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>REQUIRED: The set of permissions to check for 'resource'. Permissions with wildcards (such as '*',
        /// 'spanner.*', 'spanner.instances.*') are not allowed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("permissions")]
        public virtual System.Collections.Generic.IList<string> Permissions { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Response message for `TestIamPermissions` method.</summary>
    public class TestIamPermissionsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A subset of `TestPermissionsRequest.permissions` that the caller is allowed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("permissions")]
        public virtual System.Collections.Generic.IList<string> Permissions { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A transaction.</summary>
    public class Transaction : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>`id` may be used to identify the transaction in subsequent Read, ExecuteSql, Commit, or Rollback
        /// calls.
        ///
        /// Single-use read-only transactions do not have IDs, because single-use transactions do not support multiple
        /// requests.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>For snapshot read-only transactions, the read timestamp chosen for the transaction. Not returned by
        /// default: see TransactionOptions.ReadOnly.return_read_timestamp.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("readTimestamp")]
        public virtual object ReadTimestamp { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary># Transactions
    ///
    /// Each session can have at most one active transaction at a time. After the active transaction is completed, the
    /// session can immediately be re-used for the next transaction. It is not necessary to create a new session for
    /// each transaction.
    ///
    /// # Transaction Modes
    ///
    /// Cloud Spanner supports two transaction modes:
    ///
    /// 1. Locking read-write. This type of transaction is the only way to write data into Cloud Spanner. These
    /// transactions rely on pessimistic locking and, if necessary, two-phase commit. Locking read-write transactions
    /// may abort, requiring the application to retry.
    ///
    /// 2. Snapshot read-only. This transaction type provides guaranteed consistency across several reads, but does not
    /// allow writes. Snapshot read-only transactions can be configured to read at timestamps in the past. Snapshot
    /// read-only transactions do not need to be committed.
    ///
    /// For transactions that only read, snapshot read-only transactions provide simpler semantics and are almost always
    /// faster. In particular, read-only transactions do not take locks, so they do not conflict with read-write
    /// transactions. As a consequence of not taking locks, they also do not abort, so retry loops are not needed.
    ///
    /// Transactions may only read/write data in a single database. They may, however, read/write data in different
    /// tables within that database.
    ///
    /// ## Locking Read-Write Transactions
    ///
    /// Locking transactions may be used to atomically read-modify-write data anywhere in a database. This type of
    /// transaction is externally consistent.
    ///
    /// Clients should attempt to minimize the amount of time a transaction is active. Faster transactions commit with
    /// higher probability and cause less contention. Cloud Spanner attempts to keep read locks active as long as the
    /// transaction continues to do reads, and the transaction has not been terminated by Commit or Rollback.  Long
    /// periods of inactivity at the client may cause Cloud Spanner to release a transaction's locks and abort it.
    ///
    /// Reads performed within a transaction acquire locks on the data being read. Writes can only be done at commit
    /// time, after all reads have been completed. Conceptually, a read-write transaction consists of zero or more reads
    /// or SQL queries followed by Commit. At any time before Commit, the client can send a Rollback request to abort
    /// the transaction.
    ///
    /// ### Semantics
    ///
    /// Cloud Spanner can commit the transaction if all read locks it acquired are still valid at commit time, and it is
    /// able to acquire write locks for all writes. Cloud Spanner can abort the transaction for any reason. If a commit
    /// attempt returns `ABORTED`, Cloud Spanner guarantees that the transaction has not modified any user data in Cloud
    /// Spanner.
    ///
    /// Unless the transaction commits, Cloud Spanner makes no guarantees about how long the transaction's locks were
    /// held for. It is an error to use Cloud Spanner locks for any sort of mutual exclusion other than between Cloud
    /// Spanner transactions themselves.
    ///
    /// ### Retrying Aborted Transactions
    ///
    /// When a transaction aborts, the application can choose to retry the whole transaction again. To maximize the
    /// chances of successfully committing the retry, the client should execute the retry in the same session as the
    /// original attempt. The original session's lock priority increases with each consecutive abort, meaning that each
    /// attempt has a slightly better chance of success than the previous.
    ///
    /// Under some circumstances (e.g., many transactions attempting to modify the same row(s)), a transaction can abort
    /// many times in a short period before successfully committing. Thus, it is not a good idea to cap the number of
    /// retries a transaction can attempt; instead, it is better to limit the total amount of wall time spent retrying.
    ///
    /// ### Idle Transactions
    ///
    /// A transaction is considered idle if it has no outstanding reads or SQL queries and has not started a read or SQL
    /// query within the last 10 seconds. Idle transactions can be aborted by Cloud Spanner so that they don't hold on
    /// to locks indefinitely. In that case, the commit will fail with error `ABORTED`.
    ///
    /// If this behavior is undesirable, periodically executing a simple SQL query in the transaction (e.g., `SELECT 1`)
    /// prevents the transaction from becoming idle.
    ///
    /// ## Snapshot Read-Only Transactions
    ///
    /// Snapshot read-only transactions provides a simpler method than locking read-write transactions for doing several
    /// consistent reads. However, this type of transaction does not support writes.
    ///
    /// Snapshot transactions do not take locks. Instead, they work by choosing a Cloud Spanner timestamp, then
    /// executing all reads at that timestamp. Since they do not acquire locks, they do not block concurrent read-write
    /// transactions.
    ///
    /// Unlike locking read-write transactions, snapshot read-only transactions never abort. They can fail if the chosen
    /// read timestamp is garbage collected; however, the default garbage collection policy is generous enough that most
    /// applications do not need to worry about this in practice.
    ///
    /// Snapshot read-only transactions do not need to call Commit or Rollback (and in fact are not permitted to do so).
    ///
    /// To execute a snapshot transaction, the client specifies a timestamp bound, which tells Cloud Spanner how to
    /// choose a read timestamp.
    ///
    /// The types of timestamp bound are:
    ///
    /// - Strong (the default). - Bounded staleness. - Exact staleness.
    ///
    /// If the Cloud Spanner database to be read is geographically distributed, stale read-only transactions can execute
    /// more quickly than strong or read-write transaction, because they are able to execute far from the leader
    /// replica.
    ///
    /// Each type of timestamp bound is discussed in detail below.
    ///
    /// ### Strong
    ///
    /// Strong reads are guaranteed to see the effects of all transactions that have committed before the start of the
    /// read. Furthermore, all rows yielded by a single read are consistent with each other -- if any part of the read
    /// observes a transaction, all parts of the read see the transaction.
    ///
    /// Strong reads are not repeatable: two consecutive strong read-only transactions might return inconsistent results
    /// if there are concurrent writes. If consistency across reads is required, the reads should be executed within a
    /// transaction or at an exact read timestamp.
    ///
    /// See TransactionOptions.ReadOnly.strong.
    ///
    /// ### Exact Staleness
    ///
    /// These timestamp bounds execute reads at a user-specified timestamp. Reads at a timestamp are guaranteed to see a
    /// consistent prefix of the global transaction history: they observe modifications done by all transactions with a
    /// commit timestamp <= the read timestamp, and observe none of the modifications done by transactions with a larger
    /// commit timestamp. They will block until all conflicting transactions that may be assigned commit timestamps <=
    /// the read timestamp have finished.
    ///
    /// The timestamp can either be expressed as an absolute Cloud Spanner commit timestamp or a staleness relative to
    /// the current time.
    ///
    /// These modes do not require a "negotiation phase" to pick a timestamp. As a result, they execute slightly faster
    /// than the equivalent boundedly stale concurrency modes. On the other hand, boundedly stale reads usually return
    /// fresher results.
    ///
    /// See TransactionOptions.ReadOnly.read_timestamp and TransactionOptions.ReadOnly.exact_staleness.
    ///
    /// ### Bounded Staleness
    ///
    /// Bounded staleness modes allow Cloud Spanner to pick the read timestamp, subject to a user-provided staleness
    /// bound. Cloud Spanner chooses the newest timestamp within the staleness bound that allows execution of the reads
    /// at the closest available replica without blocking.
    ///
    /// All rows yielded are consistent with each other -- if any part of the read observes a transaction, all parts of
    /// the read see the transaction. Boundedly stale reads are not repeatable: two stale reads, even if they use the
    /// same staleness bound, can execute at different timestamps and thus return inconsistent results.
    ///
    /// Boundedly stale reads execute in two phases: the first phase negotiates a timestamp among all replicas needed to
    /// serve the read. In the second phase, reads are executed at the negotiated timestamp.
    ///
    /// As a result of the two phase execution, bounded staleness reads are usually a little slower than comparable
    /// exact staleness reads. However, they are typically able to return fresher results, and are more likely to
    /// execute at the closest replica.
    ///
    /// Because the timestamp negotiation requires up-front knowledge of which rows will be read, it can only be used
    /// with single-use read-only transactions.
    ///
    /// See TransactionOptions.ReadOnly.max_staleness and TransactionOptions.ReadOnly.min_read_timestamp.
    ///
    /// ### Old Read Timestamps and Garbage Collection
    ///
    /// Cloud Spanner continuously garbage collects deleted and overwritten data in the background to reclaim storage
    /// space. This process is known as "version GC". By default, version GC reclaims versions after they are one hour
    /// old. Because of this, Cloud Spanner cannot perform reads at read timestamps more than one hour in the past. This
    /// restriction also applies to in-progress reads and/or SQL queries whose timestamp become too old while executing.
    /// Reads and SQL queries with too-old read timestamps fail with the error `FAILED_PRECONDITION`.</summary>
    public class TransactionOptions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Transaction will not write.
        ///
        /// Authorization to begin a read-only transaction requires `spanner.databases.beginReadOnlyTransaction`
        /// permission on the `session` resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("readOnly")]
        public virtual ReadOnly ReadOnly__ { get; set; } 

        /// <summary>Transaction may write.
        ///
        /// Authorization to begin a read-write transaction requires
        /// `spanner.databases.beginOrRollbackReadWriteTransaction` permission on the `session` resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("readWrite")]
        public virtual ReadWrite ReadWrite { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>This message is used to select the transaction in which a Read or ExecuteSql call runs.
    ///
    /// See TransactionOptions for more information about transactions.</summary>
    public class TransactionSelector : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Begin a new transaction and execute this read or SQL query in it. The transaction ID of the new
        /// transaction is returned in ResultSetMetadata.transaction, which is a Transaction.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("begin")]
        public virtual TransactionOptions Begin { get; set; } 

        /// <summary>Execute the read or SQL query in a previously-started transaction.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Execute the read or SQL query in a temporary transaction. This is the most efficient way to execute
        /// a transaction that consists of a single SQL query.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("singleUse")]
        public virtual TransactionOptions SingleUse { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>`Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from
    /// an SQL query.</summary>
    public class Type : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If code == ARRAY, then `array_element_type` is the type of the array elements.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("arrayElementType")]
        public virtual Type ArrayElementType { get; set; } 

        /// <summary>Required. The TypeCode for this type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("code")]
        public virtual string Code { get; set; } 

        /// <summary>If code == STRUCT, then `struct_type` provides type information for the struct's fields.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("structType")]
        public virtual StructType StructType { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Metadata type for the operation returned by UpdateDatabaseDdl.</summary>
    public class UpdateDatabaseDdlMetadata : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Reports the commit timestamps of all statements that have succeeded so far, where
        /// `commit_timestamps[i]` is the commit timestamp for the statement `statements[i]`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("commitTimestamps")]
        public virtual System.Collections.Generic.IList<object> CommitTimestamps { get; set; } 

        /// <summary>The database being modified.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("database")]
        public virtual string Database { get; set; } 

        /// <summary>For an update this list contains all the statements. For an individual statement, this list
        /// contains only that statement.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("statements")]
        public virtual System.Collections.Generic.IList<string> Statements { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Enqueues the given DDL statements to be applied, in order but not necessarily all at once, to the
    /// database schema at some point (or points) in the future. The server checks that the statements are executable
    /// (syntactically valid, name tables that exist, etc.) before enqueueing them, but they may still fail upon later
    /// execution (e.g., if a statement from another batch of statements is applied first and it conflicts in some way,
    /// or if there is some data-related problem like a `NULL` value in a column to which `NOT NULL` would be added). If
    /// a statement fails, all subsequent statements in the batch are automatically cancelled.
    ///
    /// Each batch of statements is assigned a name which can be used with the Operations API to monitor progress. See
    /// the operation_id field for more details.</summary>
    public class UpdateDatabaseDdlRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If empty, the new update request is assigned an automatically-generated operation ID. Otherwise,
        /// `operation_id` is used to construct the name of the resulting Operation.
        ///
        /// Specifying an explicit operation ID simplifies determining whether the statements were executed in the event
        /// that the UpdateDatabaseDdl call is replayed, or the return value is otherwise lost: the database and
        /// `operation_id` fields can be combined to form the name of the resulting longrunning.Operation:
        /// `/operations/`.
        ///
        /// `operation_id` should be unique within the database, and must be a valid identifier: `a-z*`. Note that
        /// automatically-generated operation IDs always begin with an underscore. If the named operation already
        /// exists, UpdateDatabaseDdl returns `ALREADY_EXISTS`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("operationId")]
        public virtual string OperationId { get; set; } 

        /// <summary>DDL statements to be applied to the database.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("statements")]
        public virtual System.Collections.Generic.IList<string> Statements { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Metadata type for the operation returned by UpdateInstance.</summary>
    public class UpdateInstanceMetadata : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The time at which this operation was cancelled. If set, this operation is in the process of undoing
        /// itself (which is guaranteed to succeed) and cannot be cancelled again.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cancelTime")]
        public virtual object CancelTime { get; set; } 

        /// <summary>The time at which this operation failed or was completed successfully.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endTime")]
        public virtual object EndTime { get; set; } 

        /// <summary>The desired end state of the update.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instance")]
        public virtual Instance Instance { get; set; } 

        /// <summary>The time at which UpdateInstance request was received.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startTime")]
        public virtual object StartTime { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The request for UpdateInstance.</summary>
    public class UpdateInstanceRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required. A mask specifying which fields in
        /// [][google.spanner.admin.instance.v1.UpdateInstanceRequest.instance] should be updated. The field mask must
        /// always be specified; this prevents any future fields in [][google.spanner.admin.instance.v1.Instance] from
        /// being erased accidentally by clients that do not know about them.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fieldMask")]
        public virtual object FieldMask { get; set; } 

        /// <summary>Required. The instance to update, which must always include the instance name.  Otherwise, only
        /// fields mentioned in [][google.spanner.admin.instance.v1.UpdateInstanceRequest.field_mask] need be
        /// included.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("instance")]
        public virtual Instance Instance { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Arguments to insert, update, insert_or_update, and replace operations.</summary>
    public class Write : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The names of the columns in table to be written.
        ///
        /// The list of columns must contain enough columns to allow Cloud Spanner to derive values for all primary key
        /// columns in the row(s) to be modified.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("columns")]
        public virtual System.Collections.Generic.IList<string> Columns { get; set; } 

        /// <summary>Required. The table whose rows will be written.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("table")]
        public virtual string Table { get; set; } 

        /// <summary>The values to be written. `values` can contain more than one list of values. If it does, then
        /// multiple rows are written, one for each entry in `values`. Each list in `values` must have exactly as many
        /// entries as there are entries in columns above. Sending multiple lists is equivalent to sending multiple
        /// `Mutation`s, each containing one `values` entry and repeating table and columns. Individual values in each
        /// list are encoded as described here.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("values")]
        public virtual System.Collections.Generic.IList<System.Collections.Generic.IList<object>> Values { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }
}
